<!doctype html>
<html>
<head>
<meta charset='UTF-8'><meta name='viewport' content='width=device-width initial-scale=1'>

<link href='https://fonts.loli.net/css?family=Open+Sans:400italic,700italic,700,400&subset=latin,latin-ext' rel='stylesheet' type='text/css' /><style type='text/css'>html {overflow-x: initial !important;}:root { --bg-color:#ffffff; --text-color:#333333; --select-text-bg-color:#B5D6FC; --select-text-font-color:auto; --monospace:"Lucida Console",Consolas,"Courier",monospace; --title-bar-height:20px; }
.mac-os-11 { --title-bar-height:28px; }
html { font-size: 14px; background-color: var(--bg-color); color: var(--text-color); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; }
body { margin: 0px; padding: 0px; height: auto; bottom: 0px; top: 0px; left: 0px; right: 0px; font-size: 1rem; line-height: 1.42857; overflow-x: hidden; background: inherit; tab-size: 4; }
iframe { margin: auto; }
a.url { word-break: break-all; }
a:active, a:hover { outline: 0px; }
.in-text-selection, ::selection { text-shadow: none; background: var(--select-text-bg-color); color: var(--select-text-font-color); }
#write { margin: 0px auto; height: auto; width: inherit; word-break: normal; overflow-wrap: break-word; position: relative; white-space: normal; overflow-x: visible; padding-top: 36px; }
#write.first-line-indent p { text-indent: 2em; }
#write.first-line-indent li p, #write.first-line-indent p * { text-indent: 0px; }
#write.first-line-indent li { margin-left: 2em; }
.for-image #write { padding-left: 8px; padding-right: 8px; }
body.typora-export { padding-left: 30px; padding-right: 30px; }
.typora-export .footnote-line, .typora-export li, .typora-export p { white-space: pre-wrap; }
.typora-export .task-list-item input { pointer-events: none; }
@media screen and (max-width: 500px) {
  body.typora-export { padding-left: 0px; padding-right: 0px; }
  #write { padding-left: 20px; padding-right: 20px; }
  .CodeMirror-sizer { margin-left: 0px !important; }
  .CodeMirror-gutters { display: none !important; }
}
#write li > figure:last-child { margin-bottom: 0.5rem; }
#write ol, #write ul { position: relative; }
img { max-width: 100%; vertical-align: middle; image-orientation: from-image; }
button, input, select, textarea { color: inherit; font: inherit; }
input[type="checkbox"], input[type="radio"] { line-height: normal; padding: 0px; }
*, ::after, ::before { box-sizing: border-box; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p, #write pre { width: inherit; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p { position: relative; }
p { line-height: inherit; }
h1, h2, h3, h4, h5, h6 { break-after: avoid-page; break-inside: avoid; orphans: 4; }
p { orphans: 4; }
h1 { font-size: 2rem; }
h2 { font-size: 1.8rem; }
h3 { font-size: 1.6rem; }
h4 { font-size: 1.4rem; }
h5 { font-size: 1.2rem; }
h6 { font-size: 1rem; }
.md-math-block, .md-rawblock, h1, h2, h3, h4, h5, h6, p { margin-top: 1rem; margin-bottom: 1rem; }
.hidden { display: none; }
.md-blockmeta { color: rgb(204, 204, 204); font-weight: 700; font-style: italic; }
a { cursor: pointer; }
sup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-radius: 4px; cursor: pointer; }
sup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inherit; text-decoration: inherit; }
#write input[type="checkbox"] { cursor: pointer; width: inherit; height: inherit; }
figure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; }
figure > table { margin: 0px; }
tr { break-inside: avoid; break-after: auto; }
thead { display: table-header-group; }
table { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; }
table.md-table td { min-width: 32px; }
.CodeMirror-gutters { border-right: 0px; background-color: inherit; }
.CodeMirror-linenumber { user-select: none; }
.CodeMirror { text-align: left; }
.CodeMirror-placeholder { opacity: 0.3; }
.CodeMirror pre { padding: 0px 4px; }
.CodeMirror-lines { padding: 0px; }
div.hr:focus { cursor: none; }
#write pre { white-space: pre-wrap; }
#write.fences-no-line-wrapping pre { white-space: pre; }
#write pre.ty-contain-cm { white-space: normal; }
.CodeMirror-gutters { margin-right: 4px; }
.md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background: inherit; position: relative !important; }
.md-fences-adv-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; }
#write .md-fences.mock-cm { white-space: pre-wrap; }
.md-fences.md-fences-with-lineno { padding-left: 0px; }
#write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; }
.md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; }
.CodeMirror-line, twitterwidget { break-inside: avoid; }
.footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; }
.footnotes + .footnotes { margin-top: 0px; }
.md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; background: 0px 0px; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; -webkit-tap-highlight-color: transparent; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; }
li div { padding-top: 0px; }
blockquote { margin: 1rem 0px; }
li .mathjax-block, li p { margin: 0.5rem 0px; }
li blockquote { margin: 1rem 0px; }
li { margin: 0px; position: relative; }
blockquote > :last-child { margin-bottom: 0px; }
blockquote > :first-child, li > :first-child { margin-top: 0px; }
.footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; white-space: normal; }
#write .footnote-line { white-space: pre-wrap; }
@media print {
  body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; font-variant-ligatures: no-common-ligatures; }
  #write { margin-top: 0px; padding-top: 0px; border-color: transparent !important; }
  .typora-export * { -webkit-print-color-adjust: exact; }
  .typora-export #write { break-after: avoid; }
  .typora-export #write::after { height: 0px; }
  .is-mac table { break-inside: avoid; }
  .typora-export-show-outline .typora-export-sidebar { display: none; }
}
.footnote-line { margin-top: 0.714em; font-size: 0.7em; }
a img, img a { cursor: pointer; }
pre.md-meta-block { font-size: 0.8rem; min-height: 0.8rem; white-space: pre-wrap; background: rgb(204, 204, 204); display: block; overflow-x: hidden; }
p > .md-image:only-child:not(.md-img-error) img, p > img:only-child { display: block; margin: auto; }
#write.first-line-indent p > .md-image:only-child:not(.md-img-error) img { left: -2em; position: relative; }
p > .md-image:only-child { display: inline-block; width: 100%; }
#write .MathJax_Display { margin: 0.8em 0px 0px; }
.md-math-block { width: 100%; }
.md-math-block:not(:empty)::after { display: none; }
.MathJax_ref { fill: currentcolor; }
[contenteditable="true"]:active, [contenteditable="true"]:focus, [contenteditable="false"]:active, [contenteditable="false"]:focus { outline: 0px; box-shadow: none; }
.md-task-list-item { position: relative; list-style-type: none; }
.task-list-item.md-task-list-item { padding-left: 0px; }
.md-task-list-item > input { position: absolute; top: 0px; left: 0px; margin-left: -1.2em; margin-top: calc(1em - 10px); border: none; }
.math { font-size: 1rem; }
.md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-radius: 10px; }
.md-toc-content { position: relative; margin-left: 0px; }
.md-toc-content::after, .md-toc::after { display: none; }
.md-toc-item { display: block; color: rgb(65, 131, 196); }
.md-toc-item a { text-decoration: none; }
.md-toc-inner:hover { text-decoration: underline; }
.md-toc-inner { display: inline-block; cursor: pointer; }
.md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: 700; }
.md-toc-h2 .md-toc-inner { margin-left: 2em; }
.md-toc-h3 .md-toc-inner { margin-left: 4em; }
.md-toc-h4 .md-toc-inner { margin-left: 6em; }
.md-toc-h5 .md-toc-inner { margin-left: 8em; }
.md-toc-h6 .md-toc-inner { margin-left: 10em; }
@media screen and (max-width: 48em) {
  .md-toc-h3 .md-toc-inner { margin-left: 3.5em; }
  .md-toc-h4 .md-toc-inner { margin-left: 5em; }
  .md-toc-h5 .md-toc-inner { margin-left: 6.5em; }
  .md-toc-h6 .md-toc-inner { margin-left: 8em; }
}
a.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; }
.footnote-line a:not(.reversefootnote) { color: inherit; }
.md-attr { display: none; }
.md-fn-count::after { content: "."; }
code, pre, samp, tt { font-family: var(--monospace); }
kbd { margin: 0px 0.1em; padding: 0.1em 0.6em; font-size: 0.8em; color: rgb(36, 39, 41); background: rgb(255, 255, 255); border: 1px solid rgb(173, 179, 185); border-radius: 3px; box-shadow: rgba(12, 13, 14, 0.2) 0px 1px 0px, rgb(255, 255, 255) 0px 0px 0px 2px inset; white-space: nowrap; vertical-align: middle; }
.md-comment { color: rgb(162, 127, 3); opacity: 0.8; font-family: var(--monospace); }
code { text-align: left; vertical-align: initial; }
a.md-print-anchor { white-space: pre !important; border-width: initial !important; border-style: none !important; border-color: initial !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: 0px !important; background: 0px 0px !important; text-decoration: initial !important; text-shadow: initial !important; }
.md-inline-math .MathJax_SVG .noError { display: none !important; }
.html-for-mac .inline-math-svg .MathJax_SVG { vertical-align: 0.2px; }
.md-fences-math .MathJax_SVG_Display, .md-math-block .MathJax_SVG_Display { text-align: center; margin: 0px; position: relative; text-indent: 0px; max-width: none; max-height: none; min-height: 0px; min-width: 100%; width: auto; overflow-y: visible; display: block !important; }
.MathJax_SVG_Display, .md-inline-math .MathJax_SVG_Display { width: auto; margin: inherit; display: inline-block !important; }
.MathJax_SVG .MJX-monospace { font-family: var(--monospace); }
.MathJax_SVG .MJX-sans-serif { font-family: sans-serif; }
.MathJax_SVG { display: inline; font-style: normal; font-weight: 400; line-height: normal; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; overflow-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; zoom: 90%; }
#math-inline-preview-content { zoom: 1.1; }
.MathJax_SVG * { transition: none 0s ease 0s; }
.MathJax_SVG_Display svg { vertical-align: middle !important; margin-bottom: 0px !important; margin-top: 0px !important; }
.os-windows.monocolor-emoji .md-emoji { font-family: "Segoe UI Symbol", sans-serif; }
.md-diagram-panel > svg { max-width: 100%; }
[lang="flow"] svg, [lang="mermaid"] svg { max-width: 100%; height: auto; }
[lang="mermaid"] .node text { font-size: 1rem; }
table tr th { border-bottom: 0px; }
video { max-width: 100%; display: block; margin: 0px auto; }
iframe { max-width: 100%; width: 100%; border: none; }
.highlight td, .highlight tr { border: 0px; }
mark { background: rgb(255, 255, 0); color: rgb(0, 0, 0); }
.md-html-inline .md-plain, .md-html-inline strong, mark .md-inline-math, mark strong { color: inherit; }
.md-expand mark .md-meta { opacity: 0.3 !important; }
mark .md-meta { color: rgb(0, 0, 0); }
@media print {
  .typora-export h1, .typora-export h2, .typora-export h3, .typora-export h4, .typora-export h5, .typora-export h6 { break-inside: avoid; }
}
.md-diagram-panel .messageText { stroke: none !important; }
.md-diagram-panel .start-state { fill: var(--node-fill); }
.md-diagram-panel .edgeLabel rect { opacity: 1 !important; }
.md-require-zoom-fix foreignobject { font-size: var(--mermaid-font-zoom); }
.md-fences.md-fences-math { font-size: 1em; }
.md-fences-math .MathJax_SVG_Display { margin-top: 8px; cursor: default; }
.md-fences-advanced:not(.md-focus) { padding: 0px; white-space: nowrap; border: 0px; }
.md-fences-advanced:not(.md-focus) { background: inherit; }
.typora-export-show-outline .typora-export-content { max-width: 1440px; margin: auto; display: flex; flex-direction: row; }
.typora-export-sidebar { width: 300px; font-size: 0.8rem; margin-top: 80px; margin-right: 18px; }
.typora-export-show-outline #write { --webkit-flex:2; flex: 2 1 0%; }
.typora-export-sidebar .outline-content { position: fixed; top: 0px; max-height: 100%; overflow: hidden auto; padding-bottom: 30px; padding-top: 60px; width: 300px; }
@media screen and (max-width: 1024px) {
  .typora-export-sidebar, .typora-export-sidebar .outline-content { width: 240px; }
}
@media screen and (max-width: 800px) {
  .typora-export-sidebar { display: none; }
}
.outline-content li, .outline-content ul { margin-left: 0px; margin-right: 0px; padding-left: 0px; padding-right: 0px; list-style: none; }
.outline-content ul { margin-top: 0px; margin-bottom: 0px; }
.outline-content strong { font-weight: 400; }
.outline-expander { width: 1rem; height: 1.42857rem; position: relative; display: table-cell; vertical-align: middle; cursor: pointer; padding-left: 4px; }
.outline-expander::before { content: ""; position: relative; font-family: Ionicons; display: inline-block; font-size: 8px; vertical-align: middle; }
.outline-item { padding-top: 3px; padding-bottom: 3px; cursor: pointer; }
.outline-expander:hover::before { content: ""; }
.outline-h1 > .outline-item { padding-left: 0px; }
.outline-h2 > .outline-item { padding-left: 1em; }
.outline-h3 > .outline-item { padding-left: 2em; }
.outline-h4 > .outline-item { padding-left: 3em; }
.outline-h5 > .outline-item { padding-left: 4em; }
.outline-h6 > .outline-item { padding-left: 5em; }
.outline-label { cursor: pointer; display: table-cell; vertical-align: middle; text-decoration: none; color: inherit; }
.outline-label:hover { text-decoration: underline; }
.outline-item:hover { border-color: rgb(245, 245, 245); background-color: var(--item-hover-bg-color); }
.outline-item:hover { margin-left: -28px; margin-right: -28px; border-left: 28px solid transparent; border-right: 28px solid transparent; }
.outline-item-single .outline-expander::before, .outline-item-single .outline-expander:hover::before { display: none; }
.outline-item-open > .outline-item > .outline-expander::before { content: ""; }
.outline-children { display: none; }
.info-panel-tab-wrapper { display: none; }
.outline-item-open > .outline-children { display: block; }
.typora-export .outline-item { padding-top: 1px; padding-bottom: 1px; }
.typora-export .outline-item:hover { margin-right: -8px; border-right: 8px solid transparent; }
.typora-export .outline-expander::before { content: "+"; font-family: inherit; top: -1px; }
.typora-export .outline-expander:hover::before, .typora-export .outline-item-open > .outline-item > .outline-expander::before { content: "−"; }
.typora-export-collapse-outline .outline-children { display: none; }
.typora-export-collapse-outline .outline-item-open > .outline-children, .typora-export-no-collapse-outline .outline-children { display: block; }
.typora-export-no-collapse-outline .outline-expander::before { content: "" !important; }
.typora-export-show-outline .outline-item-active > .outline-item .outline-label { font-weight: 700; }


.CodeMirror { height: auto; }
.CodeMirror.cm-s-inner { background: inherit; }
.CodeMirror-scroll { overflow: auto hidden; z-index: 3; }
.CodeMirror-gutter-filler, .CodeMirror-scrollbar-filler { background-color: rgb(255, 255, 255); }
.CodeMirror-gutters { border-right: 1px solid rgb(221, 221, 221); background: inherit; white-space: nowrap; }
.CodeMirror-linenumber { padding: 0px 3px 0px 5px; text-align: right; color: rgb(153, 153, 153); }
.cm-s-inner .cm-keyword { color: rgb(119, 0, 136); }
.cm-s-inner .cm-atom, .cm-s-inner.cm-atom { color: rgb(34, 17, 153); }
.cm-s-inner .cm-number { color: rgb(17, 102, 68); }
.cm-s-inner .cm-def { color: rgb(0, 0, 255); }
.cm-s-inner .cm-variable { color: rgb(0, 0, 0); }
.cm-s-inner .cm-variable-2 { color: rgb(0, 85, 170); }
.cm-s-inner .cm-variable-3 { color: rgb(0, 136, 85); }
.cm-s-inner .cm-string { color: rgb(170, 17, 17); }
.cm-s-inner .cm-property { color: rgb(0, 0, 0); }
.cm-s-inner .cm-operator { color: rgb(152, 26, 26); }
.cm-s-inner .cm-comment, .cm-s-inner.cm-comment { color: rgb(170, 85, 0); }
.cm-s-inner .cm-string-2 { color: rgb(255, 85, 0); }
.cm-s-inner .cm-meta { color: rgb(85, 85, 85); }
.cm-s-inner .cm-qualifier { color: rgb(85, 85, 85); }
.cm-s-inner .cm-builtin { color: rgb(51, 0, 170); }
.cm-s-inner .cm-bracket { color: rgb(153, 153, 119); }
.cm-s-inner .cm-tag { color: rgb(17, 119, 0); }
.cm-s-inner .cm-attribute { color: rgb(0, 0, 204); }
.cm-s-inner .cm-header, .cm-s-inner.cm-header { color: rgb(0, 0, 255); }
.cm-s-inner .cm-quote, .cm-s-inner.cm-quote { color: rgb(0, 153, 0); }
.cm-s-inner .cm-hr, .cm-s-inner.cm-hr { color: rgb(153, 153, 153); }
.cm-s-inner .cm-link, .cm-s-inner.cm-link { color: rgb(0, 0, 204); }
.cm-negative { color: rgb(221, 68, 68); }
.cm-positive { color: rgb(34, 153, 34); }
.cm-header, .cm-strong { font-weight: 700; }
.cm-del { text-decoration: line-through; }
.cm-em { font-style: italic; }
.cm-link { text-decoration: underline; }
.cm-error { color: red; }
.cm-invalidchar { color: red; }
.cm-constant { color: rgb(38, 139, 210); }
.cm-defined { color: rgb(181, 137, 0); }
div.CodeMirror span.CodeMirror-matchingbracket { color: rgb(0, 255, 0); }
div.CodeMirror span.CodeMirror-nonmatchingbracket { color: rgb(255, 34, 34); }
.cm-s-inner .CodeMirror-activeline-background { background: inherit; }
.CodeMirror { position: relative; overflow: hidden; }
.CodeMirror-scroll { height: 100%; outline: 0px; position: relative; box-sizing: content-box; background: inherit; }
.CodeMirror-sizer { position: relative; }
.CodeMirror-gutter-filler, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-vscrollbar { position: absolute; z-index: 6; display: none; }
.CodeMirror-vscrollbar { right: 0px; top: 0px; overflow: hidden; }
.CodeMirror-hscrollbar { bottom: 0px; left: 0px; overflow: hidden; }
.CodeMirror-scrollbar-filler { right: 0px; bottom: 0px; }
.CodeMirror-gutter-filler { left: 0px; bottom: 0px; }
.CodeMirror-gutters { position: absolute; left: 0px; top: 0px; padding-bottom: 30px; z-index: 3; }
.CodeMirror-gutter { white-space: normal; height: 100%; box-sizing: content-box; padding-bottom: 30px; margin-bottom: -32px; display: inline-block; }
.CodeMirror-gutter-wrapper { position: absolute; z-index: 4; background: 0px 0px !important; border: none !important; }
.CodeMirror-gutter-background { position: absolute; top: 0px; bottom: 0px; z-index: 4; }
.CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4; }
.CodeMirror-lines { cursor: text; }
.CodeMirror pre { border-radius: 0px; border-width: 0px; background: 0px 0px; font-family: inherit; font-size: inherit; margin: 0px; white-space: pre; overflow-wrap: normal; color: inherit; z-index: 2; position: relative; overflow: visible; }
.CodeMirror-wrap pre { overflow-wrap: break-word; white-space: pre-wrap; word-break: normal; }
.CodeMirror-code pre { border-right: 30px solid transparent; width: fit-content; }
.CodeMirror-wrap .CodeMirror-code pre { border-right: none; width: auto; }
.CodeMirror-linebackground { position: absolute; left: 0px; right: 0px; top: 0px; bottom: 0px; z-index: 0; }
.CodeMirror-linewidget { position: relative; z-index: 2; overflow: auto; }
.CodeMirror-wrap .CodeMirror-scroll { overflow-x: hidden; }
.CodeMirror-measure { position: absolute; width: 100%; height: 0px; overflow: hidden; visibility: hidden; }
.CodeMirror-measure pre { position: static; }
.CodeMirror div.CodeMirror-cursor { position: absolute; visibility: hidden; border-right: none; width: 0px; }
.CodeMirror div.CodeMirror-cursor { visibility: hidden; }
.CodeMirror-focused div.CodeMirror-cursor { visibility: inherit; }
.cm-searching { background: rgba(255, 255, 0, 0.4); }
span.cm-underlined { text-decoration: underline; }
span.cm-strikethrough { text-decoration: line-through; }
.cm-tw-syntaxerror { color: rgb(255, 255, 255); background-color: rgb(153, 0, 0); }
.cm-tw-deleted { text-decoration: line-through; }
.cm-tw-header5 { font-weight: 700; }
.cm-tw-listitem:first-child { padding-left: 10px; }
.cm-tw-box { border-style: solid; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-color: inherit; border-top-width: 0px !important; }
.cm-tw-underline { text-decoration: underline; }
@media print {
  .CodeMirror div.CodeMirror-cursor { visibility: hidden; }
}


:root {
    --side-bar-bg-color: #fafafa;
    --control-text-color: #777;
}

@include-when-export url(https://fonts.loli.net/css?family=Open+Sans:400italic,700italic,700,400&subset=latin,latin-ext);

/* open-sans-regular - latin-ext_latin */
  /* open-sans-italic - latin-ext_latin */
    /* open-sans-700 - latin-ext_latin */
    /* open-sans-700italic - latin-ext_latin */
  html {
    font-size: 16px;
}

body {
    font-family: "Open Sans","Clear Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
    color: rgb(51, 51, 51);
    line-height: 1.6;
}

#write {
    max-width: 860px;
  	margin: 0 auto;
  	padding: 30px;
    padding-bottom: 100px;
}

@media only screen and (min-width: 1400px) {
	#write {
		max-width: 1024px;
	}
}

@media only screen and (min-width: 1800px) {
	#write {
		max-width: 1200px;
	}
}

#write > ul:first-child,
#write > ol:first-child{
    margin-top: 30px;
}

a {
    color: #4183C4;
}
h1,
h2,
h3,
h4,
h5,
h6 {
    position: relative;
    margin-top: 1rem;
    margin-bottom: 1rem;
    font-weight: bold;
    line-height: 1.4;
    cursor: text;
}
h1:hover a.anchor,
h2:hover a.anchor,
h3:hover a.anchor,
h4:hover a.anchor,
h5:hover a.anchor,
h6:hover a.anchor {
    text-decoration: none;
}
h1 tt,
h1 code {
    font-size: inherit;
}
h2 tt,
h2 code {
    font-size: inherit;
}
h3 tt,
h3 code {
    font-size: inherit;
}
h4 tt,
h4 code {
    font-size: inherit;
}
h5 tt,
h5 code {
    font-size: inherit;
}
h6 tt,
h6 code {
    font-size: inherit;
}
h1 {
    font-size: 2.25em;
    line-height: 1.2;
    border-bottom: 1px solid #eee;
}
h2 {
    font-size: 1.75em;
    line-height: 1.225;
    border-bottom: 1px solid #eee;
}

/*@media print {
    .typora-export h1,
    .typora-export h2 {
        border-bottom: none;
        padding-bottom: initial;
    }

    .typora-export h1::after,
    .typora-export h2::after {
        content: "";
        display: block;
        height: 100px;
        margin-top: -96px;
        border-top: 1px solid #eee;
    }
}*/

h3 {
    font-size: 1.5em;
    line-height: 1.43;
}
h4 {
    font-size: 1.25em;
}
h5 {
    font-size: 1em;
}
h6 {
   font-size: 1em;
    color: #777;
}
p,
blockquote,
ul,
ol,
dl,
table{
    margin: 0.8em 0;
}
li>ol,
li>ul {
    margin: 0 0;
}
hr {
    height: 2px;
    padding: 0;
    margin: 16px 0;
    background-color: #e7e7e7;
    border: 0 none;
    overflow: hidden;
    box-sizing: content-box;
}

li p.first {
    display: inline-block;
}
ul,
ol {
    padding-left: 30px;
}
ul:first-child,
ol:first-child {
    margin-top: 0;
}
ul:last-child,
ol:last-child {
    margin-bottom: 0;
}
blockquote {
    border-left: 4px solid #dfe2e5;
    padding: 0 15px;
    color: #777777;
}
blockquote blockquote {
    padding-right: 0;
}
table {
    padding: 0;
    word-break: initial;
}
table tr {
    border: 1px solid #dfe2e5;
    margin: 0;
    padding: 0;
}
table tr:nth-child(2n),
thead {
    background-color: #f8f8f8;
}
table th {
    font-weight: bold;
    border: 1px solid #dfe2e5;
    border-bottom: 0;
    margin: 0;
    padding: 6px 13px;
}
table td {
    border: 1px solid #dfe2e5;
    margin: 0;
    padding: 6px 13px;
}
table th:first-child,
table td:first-child {
    margin-top: 0;
}
table th:last-child,
table td:last-child {
    margin-bottom: 0;
}

.CodeMirror-lines {
    padding-left: 4px;
}

.code-tooltip {
    box-shadow: 0 1px 1px 0 rgba(0,28,36,.3);
    border-top: 1px solid #eef2f2;
}

.md-fences,
code,
tt {
    border: 1px solid #e7eaed;
    background-color: #f8f8f8;
    border-radius: 3px;
    padding: 0;
    padding: 2px 4px 0px 4px;
    font-size: 0.9em;
}

code {
    background-color: #f3f4f4;
    padding: 0 2px 0 2px;
}

.md-fences {
    margin-bottom: 15px;
    margin-top: 15px;
    padding-top: 8px;
    padding-bottom: 6px;
}


.md-task-list-item > input {
  margin-left: -1.3em;
}

@media print {
    html {
        font-size: 13px;
    }
    table,
    pre {
        page-break-inside: avoid;
    }
    pre {
        word-wrap: break-word;
    }
}

.md-fences {
	background-color: #f8f8f8;
}
#write pre.md-meta-block {
	padding: 1rem;
    font-size: 85%;
    line-height: 1.45;
    background-color: #f7f7f7;
    border: 0;
    border-radius: 3px;
    color: #777777;
    margin-top: 0 !important;
}

.mathjax-block>.code-tooltip {
	bottom: .375rem;
}

.md-mathjax-midline {
    background: #fafafa;
}

#write>h3.md-focus:before{
	left: -1.5625rem;
	top: .375rem;
}
#write>h4.md-focus:before{
	left: -1.5625rem;
	top: .285714286rem;
}
#write>h5.md-focus:before{
	left: -1.5625rem;
	top: .285714286rem;
}
#write>h6.md-focus:before{
	left: -1.5625rem;
	top: .285714286rem;
}
.md-image>.md-meta {
    /*border: 1px solid #ddd;*/
    border-radius: 3px;
    padding: 2px 0px 0px 4px;
    font-size: 0.9em;
    color: inherit;
}

.md-tag {
    color: #a7a7a7;
    opacity: 1;
}

.md-toc { 
    margin-top:20px;
    padding-bottom:20px;
}

.sidebar-tabs {
    border-bottom: none;
}

#typora-quick-open {
    border: 1px solid #ddd;
    background-color: #f8f8f8;
}

#typora-quick-open-item {
    background-color: #FAFAFA;
    border-color: #FEFEFE #e5e5e5 #e5e5e5 #eee;
    border-style: solid;
    border-width: 1px;
}

/** focus mode */
.on-focus-mode blockquote {
    border-left-color: rgba(85, 85, 85, 0.12);
}

header, .context-menu, .megamenu-content, footer{
    font-family: "Segoe UI", "Arial", sans-serif;
}

.file-node-content:hover .file-node-icon,
.file-node-content:hover .file-node-open-state{
    visibility: visible;
}

.mac-seamless-mode #typora-sidebar {
    background-color: #fafafa;
    background-color: var(--side-bar-bg-color);
}

.md-lang {
    color: #b4654d;
}

/*.html-for-mac {
    --item-hover-bg-color: #E6F0FE;
}*/

#md-notification .btn {
    border: 0;
}

.dropdown-menu .divider {
    border-color: #e5e5e5;
    opacity: 0.4;
}

.ty-preferences .window-content {
    background-color: #fafafa;
}

.ty-preferences .nav-group-item.active {
    color: white;
    background: #999;
}

.menu-item-container a.menu-style-btn {
    background-color: #f5f8fa;
    background-image: linear-gradient( 180deg , hsla(0, 0%, 100%, 0.8), hsla(0, 0%, 100%, 0)); 
}


 :root {--mermaid-font-zoom:1.23958em ;} 
</style><title>Qt编写的视频监控系统开发及使用说明</title>
</head>
<body class='typora-export os-windows typora-export-show-outline typora-export-no-collapse-outline'><div class='typora-export-content'>
<div class="typora-export-sidebar"><div class="outline-content"><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#0-前言说明">0 前言说明</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#01-系统说明">0.1 系统说明</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#02-特别说明">0.2 特别说明</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#03-功能特点">0.3 功能特点</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#031-软件模块">0.3.1 软件模块</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#032-基础功能">0.3.2 基础功能</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#033-特色功能">0.3.3 特色功能</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#04-编译说明">0.4 编译说明</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#041-版本说明">0.4.1 版本说明</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#042-注意事项">0.4.2 注意事项</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#043-离线地图">0.4.3 离线地图</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#05-视频格式">0.5 视频格式</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#051-usb摄像头">0.5.1 USB摄像头</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#052-网络地址">0.5.2 网络地址</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#053-视频文件">0.5.3 视频文件</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#06-版本说明">0.6 版本说明</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1-用户登录退出">1 用户登录退出</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11-用户登录">1.1 用户登录</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#12-用户退出">1.2 用户退出</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#2-主界面操作">2 主界面操作</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#21-面板显示隐藏">2.1 面板显示隐藏</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#22-面板拖动">2.2 面板拖动</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#23-视频播放">2.3 视频播放</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#24-视频截图">2.4 视频截图</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#25-删除视频">2.5 删除视频</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#26-画面切换">2.6 画面切换</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#27-声音调节">2.7 声音调节</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#28-视频轮询">2.8 视频轮询</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#29-通道交换">2.9 通道交换</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#210-云台控制">2.10 云台控制</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#211-设备控制">2.11 设备控制</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#212-报警订阅">2.12 报警订阅</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#213-悬浮条操作">2.13 悬浮条操作</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#214-标签设置">2.14 标签设置</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#3-视频回放">3 视频回放</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#31-本地回放">3.1 本地回放</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#311-视频查询">3.1.1 视频查询</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#312-存储规则">3.1.2 存储规则</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#313-视频下载">3.1.3 视频下载</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#32-远程回放">3.2 远程回放</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#33-设备播放">3.3 设备播放</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#34-图片回放">3.4 图片回放</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#341-图片查询">3.4.1 图片查询</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#342-存储规则">3.4.2 存储规则</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#343-图片下载">3.4.3 图片下载</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#344-导出报告">3.4.4 导出报告</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#35-视频上传">3.5 视频上传</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#351-本地设置">3.5.1 本地设置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#352-远程设置">3.5.2 远程设置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#353-文件加密">3.5.3 文件加密</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#354-功能特点">3.5.4 功能特点</a></div><ul class="outline-children"></ul></li></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#4-电子地图">4 电子地图</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#41-双击预览">4.1 双击预览</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#42-图片地图">4.2 图片地图</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#43-离线地图">4.3 离线地图</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#44-在线地图">4.4 在线地图</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#45-路径规划">4.5 路径规划</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#5-日志查询">5 日志查询</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#51-本地日志">5.1 本地日志</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#511-查询记录">5.1.1 查询记录</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#512-打印记录">5.1.2 打印记录</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#513-导出记录到xls">5.1.3 导出记录到xls</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#514-导出记录到pdf">5.1.4 导出记录到pdf</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#515-删除记录">5.1.5 删除记录</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#516-清空记录">5.1.6 清空记录</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#52-设备日志">5.2 设备日志</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#6-系统设置">6 系统设置</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#61-系统设置">6.1 系统设置</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#611-基本设置">6.1.1 基本设置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#612-视频参数">6.1.2 视频参数</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#613-数据库设置">6.1.3 数据库设置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#614-地图配置">6.1.4 地图配置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#615-功能激活">6.1.5 功能激活</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#616-颜色配置">6.1.6 颜色配置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#617-串口配置">6.1.7 串口配置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#618-网络配置">6.1.8 网络配置</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#62-录像机管理">6.2 录像机管理</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#621-录像机添加">6.2.1 录像机添加</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#622-录像机删除">6.2.2 录像机删除</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#623-录像机清空">6.2.3 录像机清空</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#624-录像机信息导入">6.2.4 录像机信息导入</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#625-录像机信息导出">6.2.5 录像机信息导出</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#626-录像机信息打印">6.2.6 录像机信息打印</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#627-导出到excel">6.2.7 导出到Excel</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#63-摄像机管理">6.3 摄像机管理</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#631-摄像机添加">6.3.1 摄像机添加</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#632-摄像机删除">6.3.2 摄像机删除</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#633-摄像机清空">6.3.3 摄像机清空</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#634-摄像机信息导入">6.3.4 摄像机信息导入</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#635-摄像机信息导出">6.3.5 摄像机信息导出</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#636-摄像机信息打印">6.3.6 摄像机信息打印</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#637-导出到excel">6.3.7 导出到Excel</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#638-设备搜索">6.3.8 设备搜索</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#64-轮询配置">6.4 轮询配置</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#641-轮询点添加">6.4.1 轮询点添加</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#642-轮询点删除">6.4.2 轮询点删除</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#643-轮询点清空">6.4.3 轮询点清空</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#644-轮询点信息导入">6.4.4 轮询点信息导入</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#645-轮询点信息导出">6.4.5 轮询点信息导出</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#645-轮询点信息打印">6.4.5 轮询点信息打印</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#647-导出到excel">6.4.7 导出到Excel</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#648-参数设置">6.4.8 参数设置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#649-批量生成">6.4.9 批量生成</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#6410-分组设置">6.4.10 分组设置</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#65-用户管理">6.5 用户管理</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#651-用户添加">6.5.1 用户添加</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#652-用户删除">6.5.2 用户删除</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#653-用户清空">6.5.3 用户清空</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#654-用户信息导入">6.5.4 用户信息导入</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#655-用户信息导出">6.5.5 用户信息导出</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#656-用户信息打印">6.5.6 用户信息打印</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#657-导出到excel">6.5.7 导出到Excel</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#658-权限验证">6.5.8 权限验证</a></div><ul class="outline-children"></ul></li></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#7-简易使用步骤">7 简易使用步骤</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#71-添加摄像机">7.1 添加摄像机</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#72-视频播放">7.2 视频播放</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#73-云台控制">7.3 云台控制</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#74-自动校时">7.4 自动校时</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#75-事件订阅">7.5 事件订阅</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#76-图片参数">7.6 图片参数</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#8-内核模块说明">8 内核模块说明</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#81-模块-onvif">8.1 模块-onvif</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#811-效果图">8.1.1 效果图</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#812-功能介绍">8.1.2 功能介绍</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#813-云台说明">8.1.3 云台说明</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#814-主要功能">8.1.4 主要功能</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#815-处理流程">8.1.5 处理流程</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#82-内核-ffmpeg">8.2 内核-ffmpeg</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#821-效果图">8.2.1 效果图</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#822-功能介绍">8.2.2 功能介绍</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#83-内核-vlc">8.3 内核-vlc</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#831-效果图">8.3.1 效果图</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#832-功能介绍">8.3.2 功能介绍</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#84-内核-mpv">8.4 内核-mpv</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#841-效果图">8.4.1 效果图</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#842-功能介绍">8.4.2 功能介绍</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#85-内核-海康sdk">8.5 内核-海康sdk</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#851-效果图">8.5.1 效果图</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#852-功能介绍">8.5.2 功能介绍</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#86-内核-萤石sdk">8.6 内核-萤石sdk</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#87-内核-大华sdk">8.7 内核-大华sdk</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#88-内核-宇视sdk">8.8 内核-宇视sdk</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#89-内核-easyplayer">8.9 内核-easyplayer</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#810-内核-大牛直播">8.10 内核-大牛直播</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#811-内核-qtav">8.11 内核-qtav</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#9-主界面模块说明">9 主界面模块说明</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#90-主界面">9.0 主界面</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#901-视频监控-普通模式">9.0.1 视频监控-普通模式</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#902-视频监控-全屏模式">9.0.2 视频监控-全屏模式</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#903-机器人监控-普通模式">9.0.3 机器人监控-普通模式</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#904-机器人监控-全屏模式">9.0.4 机器人监控-全屏模式</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#905-无人机监控-普通模式">9.0.5 无人机监控-普通模式</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#906-无人机监控-全屏模式">9.0.6 无人机监控-全屏模式</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#91-设备列表">9.1 设备列表</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#92-窗口信息">9.2 窗口信息</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#93-图文警情">9.3 图文警情</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#94-云台控制">9.4 云台控制</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#95-设备控制">9.5 设备控制</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#96-预置位置">9.6 预置位置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#97-巡航设置">9.7 巡航设置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#98-悬浮地图">9.8 悬浮地图</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#99-飞行轨迹">9.9 飞行轨迹</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#910-飞行监控">9.10 飞行监控</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#911-数据调试">9.11 数据调试</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#912-运动仿真">9.12 运动仿真</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#913-图像增强">9.13 图像增强</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#914-网页浏览">9.14 网页浏览</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#10-各系统运行图">10 各系统运行图</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#101-windows-mingw">10.1 windows-mingw</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#102-windows-msvc">10.2 windows-msvc</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#103-linux-ubuntu">10.3 linux-ubuntu</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#104-linux-deepin">10.4 linux-deepin</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#105-linux-centeros">10.5 linux-centeros</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#106-linux-uos">10.6 linux-uos</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#107-linux-kylin">10.7 linux-kylin</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#108-unix-mac">10.8 unix-mac</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11-程序框架说明">11 程序框架说明</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#111-整体代码结构">11.1 整体代码结构</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#112-主模块说明">11.2 主模块说明</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#113-子模块说明">11.3 子模块说明</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1131-第三方类库">11.3.1 第三方类库</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1132-通信及辅助类">11.3.2 通信及辅助类</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11321-模块-api">11.3.2.1 模块-api</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11322-模块-app">11.3.2.2 模块-app</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11323-模块-device">11.3.2.3 模块-device</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11324-模块-flight">11.3.2.4 模块-flight</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11325-模块-usercontrol">11.3.2.5 模块-usercontrol</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1133-核心通用类库">11.3.3 核心通用类库</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11331-模块-corecontrol">11.3.3.1 模块-core_control</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11332-模块-coredataout">11.3.3.2 模块-core_dataout</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11333-模块-coredb">11.3.3.3 模块-core_db</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11334-模块-coreffmpeg">11.3.3.4 模块-core_ffmpeg</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11335-模块-coremap">11.3.3.5 模块-core_map</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11336-模块-coreonvif">11.3.3.6 模块-core_onvif</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11337-模块-coreopengl">11.3.3.7 模块-core_opengl</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11338-模块-corequi">11.3.3.8 模块-core_qui</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11339-模块-coretcpfile">11.3.3.9 模块-core_tcpfile</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#113310-模块-corevideo">11.3.3.10 模块-core_video</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#113311-模块-corewebview">11.3.3.11 模块-core_webview</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1134-界面ui">11.3.4 界面UI</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11341-模块-frmconfig">11.3.4.1 模块-frmconfig</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11342-模块-frmdata">11.3.4.2 模块-frmdata</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11343-模块-frmdemo">11.3.4.3 模块-frmdemo</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11344-模块-frmipc">11.3.4.4 模块-frmipc</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11345-模块-frmmain">11.3.4.5 模块-frmmain</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11346-模块-frmmap">11.3.4.6 模块-frmmap</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11347-模块-frmmodule">11.3.4.7 模块-frmmodule</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11348-模块-frmrobot">11.3.4.8 模块-frmrobot</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#11349-模块-frmuavs">11.3.4.9 模块-frmuavs</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h5"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#113410-模块-frmvideo">11.3.4.10 模块-frmvideo</a></div><ul class="outline-children"></ul></li></ul></li></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#12-二次开发说明">12 二次开发说明</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#121-开发环境搭建">12.1 开发环境搭建</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1211-常规通用步骤">12.1.1 常规通用步骤</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1212-windowsmingw">12.1.2 windows+mingw</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1213-windowsmsvc">12.1.3 windows+msvc</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1214-linuxubuntu">12.1.4 linux+ubuntu</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1215-linuxdeepin">12.1.5 linux+deepin</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1216-linuxcenteros">12.1.6 linux+centeros</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1217-linuxuos">12.1.7 linux+uos</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#1218-linux银河麒麟">12.1.8 linux+银河麒麟</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#122-通用模块使用">12.2 通用模块使用</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#123-人工智能集成">12.3 人工智能集成</a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#13-其他说明">13 其他说明</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#131-海康onvif设置">13.1 海康onvif设置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#132-大华onvif设置">13.2 大华onvif设置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#133-国际onvif工具">13.3 国际onvif工具</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#134-报警输入设置">13.4 报警输入设置</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#135-环境使用qtvs">13.5 环境使用qt+vs</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#136-数据库设置mysql">13.6 数据库设置mysql</a></div><ul class="outline-children"></ul></li></ul></li></div></div><div id='write'  class=''><h2 id='0-前言说明'><span>0 前言说明</span></h2><h3 id='01-系统说明'><span>0.1 系统说明</span></h3><ol start='' ><li><span>本视频监控系统做的是通用的系统，主要偏重UI和整体框架。</span></li><li><span>主要功能包括摄像机管理，实时视频显示，设备地图显示，各种画面切换，onvif搜索设备和云台控制，通用的NVR视频流播放（比如海康的NVR支持直接取流回放）等功能。</span></li><li><span>如果是依赖SDK去实现的功能（雨刷、去雾等）都没有做，那个破坏了兼容性，无法通用其他摄像机设备以及其他操作系统。</span></li><li><span>一般都是买过去自己加上SDK的功能和自己定制的需要的功能。</span></li><li><span>每个厂家SDK和定制的功能都不一样。</span></li><li><span>本程序会不定期更新，包括使用说明，购买者可永久免费升级，一次购买终生售后。</span></li></ol><h3 id='02-特别说明'><span>0.2 特别说明</span></h3><ol start='' ><li><span>程序本身是个客户端并不是服务器程序。</span></li><li><span>摄像机管理没有限制摄像机的数量，理论上10000路肯定没有问题，就是个数据库记录。</span></li><li><span>实时显示具体能支持多少路，和具体的电脑配置有关（亲测1.8G主频8G内存I5子码流64路，总之比海康大华客户端要更优秀）。</span></li><li><span>程序实时显示界面最大可以到64路，每个通道都是打开的时候才会去建立连接取视频流，而不是一开始就建立了连接。</span></li><li><span>未经本人许可不可将本项目源码扩散，如有发现本人将追究法律责任，谢谢配合。</span></li></ol><p><strong><span>相关站点</span></strong></p><ol start='' ><li><span>国内站点：</span><a href='https://gitee.com/feiyangqingyun/' target='_blank' class='url'>https://gitee.com/feiyangqingyun/</a></li><li><span>国际站点：</span><a href='https://github.com/feiyangqingyun/' target='_blank' class='url'>https://github.com/feiyangqingyun/</a></li><li><span>个人主页：</span><a href='https://blog.csdn.net/feiyangqingyun/' target='_blank' class='url'>https://blog.csdn.net/feiyangqingyun/</a></li><li><span>知乎主页：</span><a href='https://www.zhihu.com/people/feiyangqingyun' target='_blank' class='url'>https://www.zhihu.com/people/feiyangqingyun</a></li><li><span>产品主页：</span><a href='https://blog.csdn.net/feiyangqingyun/article/details/97565652' target='_blank' class='url'>https://blog.csdn.net/feiyangqingyun/article/details/97565652</a></li></ol><h3 id='03-功能特点'><span>0.3 功能特点</span></h3><h4 id='031-软件模块'><span>0.3.1 软件模块</span></h4><ol start='' ><li><span>视频监控模块，各种停靠小窗体子模块，包括设备列表、图文警情、窗口信息、云台控制、预置位、巡航设置、设备控制、悬浮地图、网页浏览等。</span></li><li><span>视频回放模块，包括本地回放、远程回放、设备播放、图片回放、视频上传等。</span></li><li><span>电子地图模块，包括图片地图、在线地图、离线地图、路径规划等。</span></li><li><span>日志查询模块，包括本地日志、设备日志等。</span></li><li><span>系统设置模块，包括系统设置（基本设置、视频参数、数据库设置、地图配置、串口配置等）、录像机管理、摄像机管理、轮询配置、用户管理等。</span></li></ol><h4 id='032-基础功能'><span>0.3.2 基础功能</span></h4><ol start='' ><li><span>支持各种视频流（rtsp、rtmp、http等）、视频文件（mp4、rmvb、avi等）、本地USB摄像机播放。</span></li><li><span>支持多画面切换，包括1、4、6、8、9、13、16、25、36、64画面切换。</span></li><li><span>支持全屏切换，多种切换方式包括鼠标右键菜单、工具栏按钮、快捷键（alt+enter全屏，esc退出全屏）。</span></li><li><span>支持视频轮询，包括1、4、9、16画面轮询，可设置轮询分组（轮询预案）、轮询间隔、码流类型等。</span></li><li><span>支持onvif协议，包括设备搜索、云台控制、设备控制（图片参数、校对时间、系统重启，抓拍图片等）。</span></li><li><span>支持权限管理，不同的用户可以对应不同的模块权限，比如删除日志、关闭系统等。</span></li><li><span>数据库支持多种，包括sqlite、mysql、sqlserver、postgresql、oracle、人大金仓等。</span></li><li><span>本地USB摄像机支持设置分辨率、帧率等参数。</span></li><li><span>所有停靠模块都自动生成对应的菜单用来控制显示和隐藏，在标题栏右键可以弹出。</span></li><li><span>支持显示所有模块、隐藏所有模块、复位普通布局、复位全屏布局。</span></li><li><span>双击设备弹出实时预览视频，支持图片地图、在线地图、离线地图等。</span></li><li><span>摄像机节点拖曳到对应窗体播放视频，同时支持拖曳本地文件直接播放。</span></li><li><span>删除视频支持鼠标右键删除、悬浮条关闭删除、拖曳到视频监控面板外删除等多种方式。</span></li><li><span>图片地图上设备按钮可自由拖动，自动保存位置信息。百度地图上可以鼠标单击获取经纬度信息，用来更新设备位置。</span></li><li><span>视频监控面板窗体中任意通道支持拖曳交换，瞬间响应。</span></li><li><span>封装了百度地图，视图切换，运动轨迹，设备点位，鼠标按下获取经纬度等。</span></li><li><span>双击节点、拖曳节点、拖曳窗体交换位置等操作，均自动更新保存最后的播放地址，下次软件打开自动应用。</span></li><li><span>右下角音量条控件，失去焦点自动隐藏，音量条带静音图标。</span></li><li><span>支持视频截图，可指定单个或者对所有通道截图，底部小工具栏也有截图按钮。</span></li><li><span>支持超时自动隐藏鼠标指针、自动全屏机制。</span></li><li><span>支持onvif云台控制，可上下左右移动云台摄像机，包括复位和焦距调整等。</span></li><li><span>支持任意onvif摄像机，包括但不限于海康、大华、宇视、天地伟业、华为等。</span></li><li><span>可保存视频，可选定时存储或者单文件存储，可选存储间隔时间。</span></li><li><span>可设置视频流通信方式tcp+udp，可设置视频解码是速度优先、质量优先、均衡等。</span></li><li><span>可设置软件中文名称、英文名称、LOGO图标等。</span></li><li><span>存储的视频文件支持导出到指定目录，支持批量上传到服务器。</span></li></ol><h4 id='033-特色功能'><span>0.3.3 特色功能</span></h4><ol start='' ><li><span>主界面采用停靠窗体模式，各种组件以小模块的形式加入，可自定义任意模块加入。</span></li><li><span>停靠模块可拖动任意位置嵌入和悬浮，支持最大化全屏，支持多屏幕。</span></li><li><span>双重布局文件存储机制，正常模式、全屏模式都对应不同的布局方案，自动切换和保存，比如全屏模式可以突出几个模块透明显示在指定位置，更具科幻感现代化。</span></li><li><span>原创onvif协议机制，采用底层协议解析（udp广播搜索+http请求执行命令）更轻量易懂易学习拓展，不依赖任何第三方组件比如gsoap。</span></li><li><span>原创数据导入导出机制，跨平台不依赖任何组件，瞬间导出数据。</span></li><li><span>内置多个原创组件，宇宙超值超级牛逼，包括数据导入导出组件（导出到xls、pdf、打印）、数据库组件（数据库管理线程、自动清理数据线程、万能分页、数据请求等）、地图组件、视频监控组件、文件多线程收发组件、onvif通信组件、通用浏览器内核组件等。</span></li><li><span>自定义信息框+错误框+询问框+右下角提示框（包含多种格式）等。</span></li><li><span>精美换肤，高达17套皮肤样式随意更换，所有样式全部统一，包括菜单等。</span></li><li><span>视频控件悬浮条可以自行增加多个按钮，监控界面底部小工具栏也可自行增加按钮。</span></li><li><span>双击摄像机节点自动播放视频，双击节点自动依次添加视频，会自动跳到下一个，双击父节点自动添加该节点下的所有视频。可选主码流、子码流。</span></li><li><span>录像机管理、摄像机管理，可添加删除修改导入导出打印信息，立即应用新的设备信息生成树状列表，不需重启。</span></li><li><span>可选多种内核自由切换，ffmpeg、vlc、mpv等，均可在pro中设置。推荐用ffmpeg，跨平台最多，默认提供好了linux和mac平台上编译好的库。</span></li><li><span>支持硬解码，可设置硬解码类型（qsv、dxva2、d3d11va等）。</span></li><li><span>默认采用opengl绘制视频，超低的CPU资源占用，支持yuyv和nv12两种格式绘制，很牛逼。</span></li><li><span>高度可定制化，用户可以很方便的在此基础上衍生自己的功能，比如增加自定义模块，增加运行模式、机器人监控、无人机监控、挖掘机监控、检察院审判监控等。</span></li><li><span>支持xp、win7、win10、linux、mac、各种国产系统（UOS、中标麒麟、银河麒麟等）、嵌入式linux等系统。</span></li><li><span>注释完整，项目结构清晰，超级详细完整的使用开发手册，精确到每个代码文件的功能说明，不断持续迭代版本。</span></li></ol><h3 id='04-编译说明'><span>0.4 编译说明</span></h3><h4 id='041-版本说明'><span>0.4.1 版本说明</span></h4><ol start='' ><li><span>本系统没有说基于哪个Qt版本，由于系统中电子地图模块用到了浏览器模块，所以理论上要求你电脑的Qt版本也有浏览器模块才行</span></li><li><span>windows上Qt5.6以上的版本需要msvc编译器的版本才有，其余系统都会有。</span></li><li><span>如果没有则电子地图模块不可用，但是其余功能全部可用没有任何影响。</span></li><li><span>本人亲测4.7、4.8、5.5、5.6、5.7、5.9、5.12、5.13、5.14、5.15等。</span></li><li><span>2021-1-6开始集成了miniblink浏览器内核，意味着mingw版本的qt5.6以上版本也全部支持，这样就所有系统都有浏览器模块不需要担心没有电子地图的问题。</span></li></ol><h4 id='042-注意事项'><span>0.4.2 注意事项</span></h4><ol start='' ><li><span>可执行文件在源码同级目录的bin目录下。</span></li><li><span>编译完成后记得将源码下的file文件夹下的所有文件复制到可执行文件同一目录。</span></li><li><span>如果开启了视频监控（默认开启），则记得将对应的动态库文件复制到可执行文件同一目录。比如采用ffmpeg内核（默认就是ffmpeg）的话，则将下载到的dll_ffmpeg4下的所有文件复制到可执行文件同一目录。</span></li><li><span>各个操作系统的ffmpeg和vlc编译好的dll以及miniblink的dll下载地址。</span>
<a href='https://pan.baidu.com/s/13LDRu6mXC6gaADtrGprNVA' target='_blank' class='url'>https://pan.baidu.com/s/13LDRu6mXC6gaADtrGprNVA</a><span>  提取码: ujm7。</span></li><li><span>如果是64位的qt则对应的dll时候拷贝dll_ffmpeg4_64目录下的。</span></li><li><span>如果使用的ffmpeg3则对应dll目录就是dll_ffmpeg，在ffmpeg.pri文件中可以看到具体启用的是ffmpeg3（支持XP）还是ffmpeg4（不支持XP），默认是ffmpeg4。</span></li><li><span>图形字体对照表在doc目录下的IconFont.png、Font Awesome Cheatsheet.png，分别对应图形字体类 IconFont、IconHelper。</span></li><li><span>如果发现地图打不开，请先确认file目录下的所有文件有没有拷贝过去。</span></li><li><span>如果是用vs+qt可能报错 error LNK2026，解决办法详细见文档中其他说明。</span></li><li><span>默认用户名admin  密码admin</span></li></ol><h4 id='043-离线地图'><span>0.4.3 离线地图</span></h4><ol start='' ><li><span>离线地图可以用网上的瓦片地图下载器下载百度的离线地图放到对应目录即可。</span></li><li><span>也可以直接下载网盘中已经下载好的上海市的离线地图。</span></li><li><span>下载地址：</span><a href='https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g' target='_blank' class='url'>https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g</a><span> 提取密码：01jf  文件名称：bin_map_tiles.zip</span></li></ol><p><strong><span>使用说明</span></strong></p><ol start='' ><li><span>将压缩包下的两个文件夹复制到对应可执行文件下的config文件夹下，和map.js文件同一级目录。</span></li><li><span>tiles文件夹是街道图，tiles_hybrid文件夹是卫星图。</span></li><li><span>默认提供的是上海市徐汇区的瓦片地图，如果自己用万能地图下载器下载的百度地图的瓦片文件，也可以对应替换就行。</span></li><li><span>要注意的是格式，默认是jpg，如果下载的瓦片地图格式是png则需要打开config文件夹下的map_load.js文件，将.jpg改成.png保存即可。</span></li></ol><h3 id='05-视频格式'><span>0.5 视频格式</span></h3><h4 id='051-usb摄像头'><span>0.5.1 USB摄像头</span></h4><ol start='' ><li><span>内核ffmpeg写法：video=USB2.0 PC CAMERA（具体要看设备名）。</span></li><li><span>内核vlc写法：dshow://:dshow-vdev=&#39;Default&#39; （或者填USB2.0 PC CAMERA）</span></li><li><span>带参数写法：2020-12-12以后增加USB摄像头直接url带分辨率帧率写法，默认分辨率640x480。</span></li></ol><p><strong><span>写法举例</span></strong></p><ol start='' ><li><span>video=USB2.0 PC CAMERA|1920x1080|30（表示1920*1080分辨率30帧）</span></li><li><span>video=USB2.0 PC CAMERA|640x480（表示640*480分辨率）</span></li><li><span>dshow://:dshow-vdev=&#39;Default&#39;|1920x1080（vlc内核1920*1080分辨率）</span></li></ol><h4 id='052-网络地址'><span>0.5.2 网络地址</span></h4><ol start='' ><li><span>下面的地址有时候会失效，可以自行网上找找其他的地址，网络视频地址建议在晚上测试会更流畅。</span></li><li><span>大雄兔：rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov</span></li><li><span>中央卫视：rtmp://58.200.131.2:1935/livetv/cctv1 – cctv10</span></li><li><span>海康萤石：</span><a href='https://hls01open.ys7.com/openlive/6e0b2be040a943489ef0b9bb344b96b8.hd.m3u8' target='_blank' class='url'>https://hls01open.ys7.com/openlive/6e0b2be040a943489ef0b9bb344b96b8.hd.m3u8</a></li><li><span>摄像机格式：</span><a href='https://blog.csdn.net/qq_38880380/article/details/80652697' target='_blank' class='url'>https://blog.csdn.net/qq_38880380/article/details/80652697</a></li></ol><h4 id='053-视频文件'><span>0.5.3 视频文件</span></h4><ol start='' ><li><a href='http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4' target='_blank' class='url'>http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4</a></li><li><a href='http://vfx.mtime.cn/Video/2019/03/19/mp4/190319212559089721.mp4' target='_blank' class='url'>http://vfx.mtime.cn/Video/2019/03/19/mp4/190319212559089721.mp4</a></li><li><a href='http://vfx.mtime.cn/Video/2019/03/17/mp4/190317150237409904.mp4' target='_blank' class='url'>http://vfx.mtime.cn/Video/2019/03/17/mp4/190317150237409904.mp4</a></li><li><a href='http://vfx.mtime.cn/Video/2019/03/14/mp4/190314223540373995.mp4' target='_blank' class='url'>http://vfx.mtime.cn/Video/2019/03/14/mp4/190314223540373995.mp4</a></li></ol><h3 id='06-版本说明'><span>0.6 版本说明</span></h3><p><strong><span>V20210425</span></strong></p><ol start='' ><li><span>配置文件密码改成密文存储。</span></li><li><span>增加了无敌的牛逼的万能的完美入微级自动分页导航控件。</span></li><li><span>日志记录表增加索引，速度提升100倍以上。</span></li><li><span>新增多个设备轨迹 不同颜色+传入经纬度 单独示例。</span></li><li><span>对地图核心类所有覆盖物都增加颜色+粗细+透明度的参数，可动态传入对应值。</span></li><li><span>系统设置增加用户管理模块，可分别设置对应的权限。</span></li><li><span>万能权限管理算法，通过设置不同需要授权的模块名称，对应切换的按钮自动计算。</span></li><li><span>增加了appkey秘钥类，用于校验秘钥是否正确，运行时间等。</span></li></ol><p><strong><span>V20210403</span></strong></p><ol start='' ><li><span>增加全局变量AppData::LastLiveTime，记住程序最后的活动时间-包括键盘+鼠标活动，用于两个判断，一个是超过多久没有操作全屏下隐藏鼠标光标，一个是超过多久没有操作如果没有全屏则自动全屏。</span></li><li><span>增加App::TimeAutoFull配置参数用来判断比较超时自动全屏。</span></li><li><span>重命名为TimeHideCursor表示程序多久未操作自动隐藏光标，TimeAutoFull程序多久未操作自动全屏界面，下拉框选项值增加0，表示不启用此功能。</span></li><li><span>增加信息列表模块frmMsgList，用于图文列表显示信息，对应兄弟类frmMsgTable用于表格显示消息。</span></li><li><span>大改版，将中间部分全部改成了QMainWindow，子模块全部采用停靠窗体，可以悬浮半透明，自动记忆每个模块的最后的位置，启动后自动应用。</span></li><li><span>移除大改版后的所有不需要用的变量和配置参数，重新调整配置参数。</span></li><li><span>增加透明度参数用于停靠窗体独立出来后的透明度。</span></li><li><span>将摄像机控制部分比如云台+控制+预置位+巡航，单独分类到ipc模块，方便管理。</span></li><li><span>限定操作员不能移动停靠窗体等，需要管理员设计好。</span></li><li><span>修复系统设置中工作模式等切换造成的自动重启会弹出退出和登录两个窗体的BUG。</span></li><li><span>修复自动登录用户计算不正确的BUG，要以最后登录的用户为准。</span></li></ol><p><strong><span>V20210322</span></strong></p><ol start='' ><li><span>USB摄像头增加参数帧率，第二个参数是分辨率，第三个参数为帧率，不设置则采用默认的帧率，video=USB2.0 PC CAMERA|1920x1080|25。</span></li><li><span>增加独立的demo模块，专门用于测试监控系统中用到的组件和控件，演示如何使用，比如视频图片界面演示从文件夹读取图片绘制到窗体，视频窗体演示系统的核心组件视频控件的设置参数如何使用等。</span></li><li><span>增加了对其他数据库的支持，比如posgres、oracle、odbc、kingbase等数据库，理论上只要支持odbc数据源方式的都支持。</span></li><li><span>增加IndexStart启动窗体索引配置参数，0-主程序 1-演示示例。</span></li></ol><p><strong><span>V20210305</span></strong></p><ol start='' ><li><span>修复数据库有时候没加载到的BUG。</span></li><li><span>新增配置参数控制画面切换的菜单和快捷图标是否显示。</span></li><li><span>ffmpeg内核增加了可动态保存机制，点击开始保存按钮启动保存，单击结束则生成视频文件，如此往复。</span></li><li><span>海康内核判断主码流子码流改成了 /101? 和 /main/ 同时判断。</span></li><li><span>新增多屏幕的支持，自动在对应屏幕最大化全屏，对话框位置，右下角提示框等。</span></li><li><span>再次分类存放代码文件，分成core ui class三大类。</span></li><li><span>系统配置更改视频控件参数，统一一个函数设置，initCommonVideoWidget函数中做了过滤，必须关闭状态的视频控件设置才起作用。</span></li><li><span>设备播放模块增加大华NVR的远程回放地址，其他地址计算算法调整。</span></li><li><span>新增界面模块功能启用配置参数。</span></li><li><span>新增主界面顶部导航模块中间界面，用于不同的运行模式加载不同的模块。</span></li></ol><p><strong><span>V20201212</span></strong></p><ol start='' ><li><span>增加USB摄像机分辨率设置，直接url带掉。</span></li><li><span>所有地图内核公用一个，复用代码。</span></li><li><span>增加地图默认级别和中心点坐标设置参数。</span></li><li><span>主界面四个模块独立出来，做成了可配置，这样后期可以任意位置放置自定义模块。</span></li><li><span>四个模块标题栏自定义。</span></li><li><span>vlc内核和mpv内核的离线判断，当句柄模式下，统一为getLastTime，当调用该函数的时候自动查询播放状态，如果正在播放则自动更新时间为当前时间。</span></li><li><span>将各种在代码中define定义不同内核的代码全部优化，统一为一个类，很大减少代码量，统一为CommonVideoWidget和CommonVideoManage类。</span></li></ol><p><strong><span>V20201108</span></strong></p><ol start='' ><li><span>轮询点模块增加批量生成功能。</span></li><li><span>录像机、摄像机、轮询点，增加导入导出功能。</span></li><li><span>ffmpeg内核增加读取帧回调，超时识别，可以快速识别掉线。</span></li></ol><p><strong><span>20200828</span></strong></p><ol start='' ><li><span>增加了云台控制过滤，没有打开的视频禁用云台。</span></li><li><span>linux上全屏BUG修复，采用showfullscreen。</span></li><li><span>增加轮询点管理模块。</span></li><li><span>修正轮询的可能崩溃的BUG。</span></li></ol><p><strong><span>V20200730</span></strong></p><ol start='' ><li><span>系统设置增加了视频上传模块，用来将本地的视频文件传输到服务器，多线程并发。</span></li><li><span>视频监控内核新增MPV内核，修正了其他内核的部分函数和处理。</span></li><li><span>海康内核进行大改动，同时支持视频流和本地MP4文件播放，自动分析切换。</span></li><li><span>海康内核增加回调处理，可以拿到每一张图片。</span></li><li><span>海康内核进行了linux上的实验，可以正常播放。</span></li><li><span>ffmpeg内核增加保存到MP4。</span></li><li><span>本地文件回放vlc部分增加进度切换等。</span></li><li><span>悬浮条关闭按钮增加实际处理，之前只是打印消息。</span></li><li><span>改进了vlc和mpv的事件回调机制，使其同时支持qt4+qt5。</span></li></ol><p><strong><span>V20200620</span></strong></p><ol start='' ><li><span>增加了opengl显示实时视频，CPU占用极低。</span></li><li><span>增加了地图上设备点位置的调整。</span></li><li><span>设备点双击弹出实时视频预览。</span></li><li><span>增加GPS运动轨迹显示。</span></li><li><span>ffmpeg解码类增加了音频播放，采用的QAudioOutput。</span></li></ol><p><strong><span>V20191105</span></strong></p><ol start='' ><li><span>增加云台控制功能，可以上下左右等八个方位控制云台，默认采用相对移动，云台中间按下表示复位。</span></li><li><span>系统设置增加码流类型选择，默认子码流，切换完自动应用。</span></li><li><span>云台控制增加速度功能，值越大，速度越快。</span></li><li><span>增加焦距控制，可放大缩小，速度也可控制。</span></li></ol><h2 id='1-用户登录退出'><span>1 用户登录退出</span></h2><h3 id='11-用户登录'><span>1.1 用户登录</span></h3><p><img src="snap/1-1-1.jpg" referrerpolicy="no-referrer"><span>  </span><img src="snap/1-1-2.jpg" referrerpolicy="no-referrer">
<span>系统默认开启了自动登录，可以在系统设置中将自动登录按钮关闭即可，可以在用户登录界面勾选记住密码和自动登录复选框，如果勾选了记住密码，则下次弹出的登录窗体会自动把最后一次的密码填进去，如果勾选了自动登录，则直接以上一次的用户登录到系统。</span></p><h3 id='12-用户退出'><span>1.2 用户退出</span></h3><p><img src="snap/1-2-1.jpg" referrerpolicy="no-referrer">
<span>如果开启了自动登录机制，在单击右上角的关闭按钮，会弹出用户退出窗体，需要输入密码才能退出，也可以在代码中屏蔽掉自动登录的判断，这样任何时候关闭系统都会弹出窗体要求输入密码来退出。用户登录和退出内置了超级密码 a ，在记不住密码或者密码丢失的时候使用。</span></p><h2 id='2-主界面操作'><span>2 主界面操作</span></h2><p><img src="snap/2-0-1.jpg" referrerpolicy="no-referrer">
<img src="snap/2-0-2.jpg" referrerpolicy="no-referrer">
<span>主界面由左侧的设备列表、窗口信息，中间的视频监控画面，底部的画面切换和快捷操作按钮，右侧的云台控制及其他操作功能面板组成，其中左右两侧的面板可以拉伸宽度，上下面板之间也可以拉伸高度，每个带关闭按钮的面板都可以关闭。</span></p><p><strong><span>新增说明</span></strong>
<span>2021-5-8，主界面改成了停靠窗体模式，拓展性更强，可以任意组合多种子模块，模块可停靠悬浮，在普通模式和全屏模式都有独立的布局文件，不同的工作模式都可对应不同的布局文件。</span></p><h3 id='21-面板显示隐藏'><span>2.1 面板显示隐藏</span></h3><p><img src="snap/2-1-1.jpg" referrerpolicy="no-referrer"></p><p><img src="snap/2-1-2.jpg" referrerpolicy="no-referrer">
<span>左侧和右侧的面板，可以通过单击面板右上角的关闭按钮来隐藏，当隐藏一个面板以后，剩余的面板会自动填充布局，如果需要重新显示面板，则在标题栏鼠标右键就可以对小面板进行显示和隐藏，右上角的时间和CPU显示面板可以在系统设置中控制显示隐藏。系统会自动记住最后的布局比如显示的面板和宽高占比，下次启动后自动应用。</span>
<strong><span>特别说明</span></strong></p><ol start='' ><li><span>在停靠窗体的标题栏鼠标右键也会弹出子窗体的开启菜单，复选框勾选表示显示，悬浮的窗体没有这个特性，一定要是嵌入在主界面中的子窗体标题栏才有。</span></li><li><span>如果是全屏模式，由于没有了标题栏，想要关闭模块的话，需要将其拖动到边缘嵌入主窗体，然后在标题栏鼠标右键菜单中关闭即可。</span></li></ol><h3 id='22-面板拖动'><span>2.2 面板拖动</span></h3><p><span>面板和面板之间有个分隔条，鼠标移到对应分隔条的地方，会变成可拉动的鼠标指针，此时可以上下左右拉动调整宽高，调整好以后会自动保存宽高比例，下次启动后自动应用最后的配置来显示。</span></p><p><img src="snap/2-2-1.jpg" referrerpolicy="no-referrer"></p><h3 id='23-视频播放'><span>2.3 视频播放</span></h3><p><img src="snap/2-3-1.jpg" referrerpolicy="no-referrer">
<span>视频播放同时支持多种方式：</span></p><ol start='' ><li><span>双击子节点播放单个摄像机，在当前选中通道处播放。</span></li><li><span>双击父节点播放整个录像机的摄像机，依次排列。</span></li><li><span>按住子节点拖曳到对应通道，播放摄像机。</span></li><li><span>本地文件直接拖曳到通道，自动播放本地文件。</span></li><li><span>启动后自动播放最后通道的视频信息。</span></li></ol><h3 id='24-视频截图'><span>2.4 视频截图</span></h3><p><span>在视频监控主界面，通道鼠标右键，会弹出右键菜单，选择截图当前视频或者截图所有视频，截图默认保存在可执行文件所在目录下的snap目录。视频面板底部工具栏也有截图按钮触发这个动作。</span>
<span>文件名格式：Ch1_2020-07-30-13-41-24.png。</span></p><p><img src="snap/2-4-1.jpg" referrerpolicy="no-referrer"></p><h3 id='25-删除视频'><span>2.5 删除视频</span></h3><p><span>有多种方法可以删除视频：</span></p><ol start='' ><li><span>鼠标右键删除当前视频。</span></li><li><span>鼠标右键删除所有视频。</span></li><li><span>按住通道画面移出视频监控画面。</span></li><li><span>悬浮条关闭按钮。</span></li></ol><p><img src="snap/2-5-1.jpg" referrerpolicy="no-referrer"></p><h3 id='26-画面切换'><span>2.6 画面切换</span></h3><p><span>系统支持多画面切换，全屏切换等，包括1+4+6+8+9+13+16+25+36+64画面切换，如果还需要增加更多的画面比如81+100等，可以直接在源码中稍微修改即可。</span></p><ol start='' ><li><span>鼠标右键画面切换。</span></li><li><span>底部左侧画面切换缩略图。</span></li><li><span>快捷键alt+enter全屏。</span></li><li><span>快捷键esc退出全屏。</span></li></ol><p><img src="snap/2-6-1.jpg" referrerpolicy="no-referrer"></p><p><span>64画面效果图</span></p><p><img src="snap/2-6-2.jpg" referrerpolicy="no-referrer"></p><h3 id='27-声音调节'><span>2.7 声音调节</span></h3><p><img src="snap/2-7-1.jpg" referrerpolicy="no-referrer">
<span>在主界面画面栏右下角，按下声音图标自动弹出声音调节面板，失去焦点自动隐藏，拉动声音滚动条来调节声音大小，还有静音图标，声音调节目前做的是一个界面效果，并没有功能，具体功能自己实现，vlc内核和mpv内核已经封装了声音控制的接口函数。</span></p><h3 id='28-视频轮询'><span>2.8 视频轮询</span></h3><p><span>视频轮询默认4画面轮询，如果需要其他画面，可以在系统设置中设置即可。</span>
<span>有两种方式可以启动视频轮询功能：</span></p><ol start='' ><li><span>鼠标右键启动轮询。</span></li><li><span>画面右下角轮询按钮。</span></li></ol><p><img src="snap/2-8-1.jpg" referrerpolicy="no-referrer"></p><h3 id='29-通道交换'><span>2.9 通道交换</span></h3><p><img src="snap/2-9-1.jpg" referrerpolicy="no-referrer">
<span>通道交换功能很常用，一般用户喜欢调整自己想要的通道显示到前面或者占据画面的更大部分，比如6画面8画面的时候，左侧有一个画面占据很大的位置，一般这个用来显示重要性最高的实时视频，如果需要通道交换，则按住通道拖动到另外一个通道上面松开鼠标即可，会立即应用，瞬间切换，这里切记不要移出视频画面外，移出去表示删除。</span></p><h3 id='210-云台控制'><span>2.10 云台控制</span></h3><p><span>如果需要控制云台移动，先要选择对应的通道，边缘会高亮，进行云台控制的前提是该摄像机要是支持云台的摄像机，很多人以为啥摄像机都可以移动，这是错误的，如果摄像机不支持云台，这个功能就别玩了，玩不起，经常遇到一些人说怎么云台不能用了，一检查尼玛原来摄像机根本没有云台。</span></p><p><img src="snap/2-10-1.jpg" referrerpolicy="no-referrer">
<span>本系统云台控制走的是onvif协议，没有使用私有协议，上百家厂家的摄像机，走私有协议会玩死人的，所以统一采用onvif通用协议，需要提前在系统设置中的摄像机管理，搜索摄像机，输入正确的onvif用户信息后一键获取到云台地址。</span></p><h3 id='211-设备控制'><span>2.11 设备控制</span></h3><p><img src="snap/2-11-1.jpg" referrerpolicy="no-referrer">
<span>设备控制部分，目前可以获取和设置图片参数、手动校时、重启设备等，上面那一堆复选框对应功能需要用厂家sdk去实现，后期可能会增加一些onvif能够处理的功能。和云台控制操作一样，操作前也是需要选中某个通道，然后才是对选中的通道进行设备控制，比如图片参数中的明亮度、对比度、饱和度。</span></p><h3 id='212-报警订阅'><span>2.12 报警订阅</span></h3><p><img src="snap/2-12-1.jpg" referrerpolicy="no-referrer">
<span>本系统默认支持海康摄像机的报警事件订阅，默认已经订阅，如果摄像机已经开启了报警事件的话，默认一般是关闭的，比如摄像机后面的开关量输入报警接口，需要web页面进去设置开启。报警订阅走的是onvif协议，默认测试过海康的摄像机，其余摄像机有些没有测试成功，后期会详细查下原因并改进，会持续更新完善。</span></p><h3 id='213-悬浮条操作'><span>2.13 悬浮条操作</span></h3><p><span>本系统中将视频显示这块都封装成了一个控件，每个视频控件都有自己独立的悬浮条，悬浮条的位置可以自行修改两三行代码调整，默认悬浮条在顶部，自动拉伸填充显示，你也可以改成左侧右侧等位置显示，高度可调。悬浮条是一排按钮组成，具体按钮什么名称标识符和功能，可以自定义，控件的封装只是默认放了一排按钮，除了关闭按钮实现了功能外，其余都是信号的形式发出去的，具体操作由程序员本身根据不同的厂家来定义不同的功能。</span></p><p><img src="snap/2-13-1.jpg" referrerpolicy="no-referrer"></p><h3 id='214-标签设置'><span>2.14 标签设置</span></h3><p><img src="snap/2-14-1.jpg" referrerpolicy="no-referrer">
<span>视频控件已经将OSD标签封装好了，默认提供两路OSD设置，每个OSD都可以设置是否启用、位置、文字内容、文字颜色、图片、文字大小等，这些设置都提供了友好的接口设置。</span></p><p><span>在frmvideopanel.cpp文件中有设置示例，默认注释的，参数含义如下：</span></p><ol start='' ><li><span>设置标签可见：setOSD1Visible</span></li><li><span>设置文字大小：setOSD1FontSize</span></li><li><span>设置文本文字：setOSD1Text</span></li><li><span>设置文字颜色：setOSD1Color</span></li><li><span>设置标签格式：setOSD1Format</span></li><li><span>设置标签位置：setOSD1Position</span></li></ol><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="cpp" style="break-inside: unset;"><div class="CodeMirror cm-s-inner CodeMirror-wrap" lang="cpp"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.29412px; left: 8.02942px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">enum</span> <span class="cm-def">OSDFormat</span> {</span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">OSDFormat_Text</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-comment">//文本</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">OSDFormat_Date</span> <span class="cm-operator">=</span> <span class="cm-number">1</span>, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-comment">//日期</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">OSDFormat_Time</span> <span class="cm-operator">=</span> <span class="cm-number">2</span>, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-comment">//时间</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">OSDFormat_DateTime</span> <span class="cm-operator">=</span> <span class="cm-number">3</span>, &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-comment">//日期时间</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">OSDFormat_Image</span> <span class="cm-operator">=</span> <span class="cm-number">4</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-comment">//图片</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">};</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="">​</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">enum</span> <span class="cm-def">OSDPosition</span> {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">OSDPosition_Left_Top</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>, &nbsp; &nbsp; &nbsp; <span class="cm-comment">//左上角</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">OSDPosition_Left_Bottom</span> <span class="cm-operator">=</span> <span class="cm-number">1</span>, &nbsp; &nbsp;<span class="cm-comment">//左下角</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">OSDPosition_Right_Top</span> <span class="cm-operator">=</span> <span class="cm-number">2</span>, &nbsp; &nbsp; &nbsp;<span class="cm-comment">//右上角</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">OSDPosition_Right_Bottom</span> <span class="cm-operator">=</span> <span class="cm-number">3</span> &nbsp; &nbsp;<span class="cm-comment">//右下角</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">};</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 316px;"></div><div class="CodeMirror-gutters" style="display: none; height: 316px;"></div></div></div></pre><h2 id='3-视频回放'><span>3 视频回放</span></h2><p><span>视频回放中有多个子模块，分别是不同的含义：</span></p><ol start='' ><li><span>本地回放：回放存储在本地电脑的视频文件。</span></li><li><span>远程回放：通过sdk方式回放NVR上的存储录像（暂未实现，每个厂家不一样）。</span></li><li><span>设备播放：通用的rtsp取流形式的播放实时视频和回放录像文件。</span></li><li><span>图片回放：查找对应文件夹下的所有通道图片，按照设定的间隔回复，类似视频效果，一般用在存储一堆图片序列的应用场景中。</span></li><li><span>视频上传：将查询的本地存储的视频文件上传到云端服务器。类似于将视频文件存储到服务器上，需要手动填写服务器地址和端口。</span></li></ol><h3 id='31-本地回放'><span>3.1 本地回放</span></h3><h4 id='311-视频查询'><span>3.1.1 视频查询</span></h4><p><img src="snap/3-1-1.jpg" referrerpolicy="no-referrer">
<span>本地回放模块主要用来回放存储在本地电脑上的视频，先从右侧选择要回放的通道，默认是所有通道，然后选择类型：存储视频还是报警视频，默认选择存储视频（目前也只有存储的视频，没有报警视频，报警视频的规则还没定好，一般都是买过去自己定义），然后选择要查询的开始时间和结束时间，单击查询按钮，会自动列出来，双击对应的视频文件名称就会播放，除了查询按钮，其余按钮均没有实现具体功能。</span></p><h4 id='312-存储规则'><span>3.1.2 存储规则</span></h4><p><img src="snap/3-1-2-1.jpg" referrerpolicy="no-referrer"></p><ol start='' ><li><span>默认存储主目录 video_normal</span></li><li><span>主目录下按照日期目录存放 比如 2021-04-07 2021-04-08</span></li><li><span>日期目录下是单个的视频文件 比如 Ch1_2021-04-07-14-08-11.mp4。</span></li><li><span>拓展功能可以存储对应的数据文件比如经纬度数据和视频文件一个目录 名称一样 拓展名可以是 txt</span></li></ol><h4 id='313-视频下载'><span>3.1.3 视频下载</span></h4><p><span>视频下载是将查询出来的视频文件，按照勾选了的文件保存到选择的目录中。</span></p><p><img src="snap/3-1-3-1.jpg" referrerpolicy="no-referrer"></p><h3 id='32-远程回放'><span>3.2 远程回放</span></h3><p><img src="snap/3-2-1.jpg" referrerpolicy="no-referrer">
<span>远程回放模块是用来通过sdk的形式回放远程NVR设备上的录像文件，这个暂未实现，本系统主要是为了兼容性和通用性，通过具体sdk形式调用的处理都没有做，破坏了移植性，到了其他平台就没法使用了，本系统sdk使用这块默认用的海康sdk作为示例。</span></p><h3 id='33-设备播放'><span>3.3 设备播放</span></h3><p><img src="snap/3-3-1.jpg" referrerpolicy="no-referrer">
<span>设备播放模块主要是通过rtsp视频流的形式来拉取实时视频和回放视频，现在越来越多的NVR支持直接通过取流的形式来拉取实时视频流和回放视频，这样使用起来很方便，当然在拉取视频流的时候要传入用户信息，防止非法获取，现在越来越多的应用场景需要通过NVR来调取回放视频，传统的SDK的方式非常累厂家太多，而国标的形式太繁琐复杂，于是rtsp形式的最简单的方式应运而生，目前支持的厂家也越来越多，每个厂家格式的规则不一样，可以自行咨询厂家的规则，本程序默认实现了海康、大华和深广的规则。</span></p><h3 id='34-图片回放'><span>3.4 图片回放</span></h3><h4 id='341-图片查询'><span>3.4.1 图片查询</span></h4><p><img src="snap/3-4-1-1.jpg" referrerpolicy="no-referrer">
<span>选择设备通道和时间范围，单击查询按钮，会将查询到的图片序列按照日期的形式作为一行添加到列表结果中，双击可以自动播放，可以调节播放速度。</span></p><h4 id='342-存储规则'><span>3.4.2 存储规则</span></h4><ol start='' ><li><span>默认存储主目录 image_normal</span></li><li><span>主目录下按照日期目录存放 比如 2021-04-07 2021-04-08</span></li><li><span>日期目录下是单个的图片文件 比如 Ch1_2021-04-07-14-08-11-222.jpg。</span></li><li><span>拓展功能可以存储对应的数据文件比如警情文字和图片文件一个目录 名称一样 拓展名可以是 txt 。</span></li></ol><p><img src="snap/3-4-2-1.jpg" referrerpolicy="no-referrer"></p><h4 id='343-图片下载'><span>3.4.3 图片下载</span></h4><p><img src="snap/3-4-3-1.jpg" referrerpolicy="no-referrer">
<span>将勾选的图片序列文件，导出到选择的目录。</span></p><h4 id='344-导出报告'><span>3.4.4 导出报告</span></h4><p><img src="snap/3-4-4-1.jpg" referrerpolicy="no-referrer">
<span>图文混排，可以自定义信息，封装好的类，传入图片队列，图片自适应等比例缩放显示，超过自动分页。</span></p><h3 id='35-视频上传'><span>3.5 视频上传</span></h3><p><span>视频上传功能主要用来将本地存储的视频文件（也可以是其他文件），通过网络传输（默认TCP）上传到其他地方比如服务器，服务器上要运行接收文件的程序，这样就相当于远程备份视频文件的功能，视频文件可以勾选需要上传哪一些。</span></p><p><img src="snap/3-5-1.jpg" referrerpolicy="no-referrer"></p><h4 id='351-本地设置'><span>3.5.1 本地设置</span></h4><p><span>本地只需要在视频监控系统客户端上切换到视频上传页面，然后选择要查询的日期范围，单击查询，会将视频文件查询出来显示在左边的表格中，可以勾选要上传的视频文件，右侧填写好服务器的IP和端口（默认6000），单击上传按钮，会多线程的形式上传文件。</span></p><h4 id='352-远程设置'><span>3.5.2 远程设置</span></h4><p><span>远程需要放置文件传输工具，该工具完整源码如果购买了视频监控系统，可以赠送，该工具同时具备了发送端和接收端的功能，配套视频监控系统使用的是接收端，视频监控系统作为发送端，填好监听端口后，单击监听按钮，一旦有连接文件上传，会自动显示对应的接收进度，文件名称以上传的文件名为准。</span></p><h4 id='353-文件加密'><span>3.5.3 文件加密</span></h4><p><span>默认文件传输过程采用了加密机制，意味着传输的数据是加密后的数据，接收到以后根据设置的秘钥进行解密重新生成文件，防止文件传输过程中被拦截，可自定义加密规则。</span></p><h4 id='354-功能特点'><span>3.5.4 功能特点</span></h4><ol start='' ><li><span>多线程收发文件，支持加密传输。</span></li><li><span>接收端支持监听端口接收文件和主动连接服务器接收文件两种方式。</span></li><li><span>按照 文件开始符+文件大小+文件内容+文件结束符 逐个分包接收。</span></li><li><span>可对接收的加密过的文件包进行解密输出。</span></li><li><span>如果采用连接服务器方式接收文件可指定请求文件。</span></li><li><span>接收端请求文件的形式可以作为通用的程序升级方案。</span></li><li><span>进度条实时更新收发文件的进度。</span></li><li><span>发送端可设置每个包最很大小即切片分包数量。</span></li><li><span>发送端可对文件的每个包进行加密传输。</span></li><li><span>发送端支持对包进行合并发送。</span></li><li><span>可指定目录对客户端发来的请求文件进行搜索。</span></li><li><span>每个功能独立的一个类，接口清晰友好，使用方便。</span></li><li><span>支持任意Qt版本、任意系统、任意编译器。</span></li></ol><p>&nbsp;</p><h2 id='4-电子地图'><span>4 电子地图</span></h2><p><span>电子地图有多个子模块，分别不同的功能，在每个模块上，双击对应的摄像机，都可以弹出实时视频预览画面，支持多个画面同时打开，每个摄像机都一个画面窗体。</span></p><ol start='' ><li><span>图片地图：摄像机分布在平面图上。</span></li><li><span>离线地图：默认采用百度离线瓦片地图，本地使用。</span></li><li><span>在线地图：默认采用百度地图，需要联网使用。</span></li><li><span>路径规划：指定起始点和终点经纬度坐标，查询最优路径并绘制路线，提取路线坐标集合，动态模拟轨迹，比如机器人和飞机轨迹。</span></li></ol><h3 id='41-双击预览'><span>4.1 双击预览</span></h3><p><img src="snap/4-1-1.jpg" referrerpolicy="no-referrer"></p><h3 id='42-图片地图'><span>4.2 图片地图</span></h3><ol start='' ><li><span>图片地图的功能是为了方便直接提供图片文件，然后摄像机点位可直接拖动，更精确定位的场景，图片可以提供鸟瞰图这种，看起来更直观大气，有3D的感觉。</span></li><li><span>图片文件存放在可执行文件下的map文件夹下，如果需要增加或者删除，可以直接文件操作即可，比如复制新的图片文件到这个目录下即可。</span></li><li><span>具体摄像机对应哪张图片，可以在摄像机管理中设置，对应字段为地图，直接下拉选择对应的地图即可，默认选择无，就是该摄像机不属于任何地图。</span></li></ol><p><img src="snap/4-2-1.jpg" referrerpolicy="no-referrer"></p><h3 id='43-离线地图'><span>4.3 离线地图</span></h3><p><span>功能和在线地图完全一致，唯一区别就是地图是离线的，不需要联网。离线的地图需要自己准备好，可以网上通过瓦片地图下载器来下载需要的地方的离线地图，一般离线地图比较大，他是一张张图片，所以建议离线地图只下载自己需要的即可，比如某个县的地图，而不是所有的，所有的起码有几十GB。</span></p><p><img src="snap/4-3-1.jpg" referrerpolicy="no-referrer"></p><p><strong><span>使用说明</span></strong>
<span>默认系统提供的是上海市的地图，下载地址在下面文章中，会自动更新地址：</span>
<a href='https://blog.csdn.net/feiyangqingyun/article/details/104005917' target='_blank' class='url'>https://blog.csdn.net/feiyangqingyun/article/details/104005917</a>
<span>请下载同目录下的bin_map_tiles.zip压缩包，解压到config目录下，最后config文件夹下会多出来tiles tiles_hybrid两个文件夹。</span></p><h3 id='44-在线地图'><span>4.4 在线地图</span></h3><p><span>在摄像机管理的界面，可以添加经纬度信息，这样就可以在地图上显示对应的摄像机点位信息，如果发现位置不对，可以在右侧先选择摄像机设备，然后鼠标单击新的位置，右侧目标经度、目标纬度信息会自动更新，然后再单击更新经纬度值则会更新当前下拉选择的设备的经纬度信息，也可以在摄像机管理界面手动填入进行修改。</span>
<span>在右侧还有模拟运动轨迹、开始显示轨迹两个按钮，有可能后期还会增加其他功能，是为了演示如何在地图上实现地图的相关功能，开始显示轨迹采用的定时器来生成轨迹点数据，动态模拟运动轨迹，可以单击显示设备位置按钮还原最初的设备点位图。</span></p><p><img src="snap/4-4-1.jpg" referrerpolicy="no-referrer"></p><p><strong><span>功能特点</span></strong></p><ol start='' ><li><span>同时支持在线地图和离线地图两种模式。</span></li><li><span>同时支持webkit内核、webengine内核、IE内核。</span></li><li><span>支持设置多个标注点，信息包括名称、地址、经纬度。</span></li><li><span>可设置地图是否可单击、拖动、鼠标滚轮缩放。</span></li><li><span>可设置协议版本、秘钥、主题样式、中心坐标、中心城市、地理编码位置等。</span></li><li><span>可设置地图缩放比例和级别，缩略图、比例尺、路况信息等控件的可见。</span></li><li><span>支持地图交互，比如鼠标按下获取对应位置的经纬度。</span></li><li><span>支持查询路线，可设置起点位置、终点位置、路线模式、路线方式、路线方案（最少时间、最少换乘、最少步行、不乘地铁、最短距离、避开高速）。</span></li><li><span>可显示点线面工具，可直接在地图上划线、点、矩形、圆形等。</span></li><li><span>可设置行政区划，指定某个城市区域绘制图层，在线地图自动输出行政区划边界点集合到js文件给离线地图使用。</span></li><li><span>可静态或者动态添加多个覆盖物。支持点、折线、多边形、矩形、圆形、弧线、点聚合等。</span></li><li><span>函数接口友好和统一，使用简单方便，就一个类。</span></li><li><span>支持js动态交互添加点、删除点、清空点、重置点，不需要刷新页面。</span></li><li><span>支持任意Qt版本、任意系统、任意编译器。</span></li></ol><h3 id='45-路径规划'><span>4.5 路径规划</span></h3><p><strong><span>基本步骤</span></strong></p><ol start='' ><li><span>输入起点坐标和终点坐标，也可以勾选地图选点，开启后直接在左侧的地图界面鼠标按下自动识别对应的经纬度坐标填入，单选框勾选的起点则填入起点坐标输入框中，勾选的终点就填入终点坐标输入框中。</span></li><li><span>选择路线方式，可选公交、驾车、步行、骑行等方式，默认选择步行。</span></li><li><span>选择路线方案，可选最少时间、最短距离、避开高速等。</span></li><li><span>输入关键点数，一般查询返回的路径的经纬度坐标点数非常密集，可能非常多，我们需要根据输入的关键点数来过滤，比如输入30，表示从所有经纬度数据中平均提取出来30个数据就行。点数合计，查询路线后自动返回所有经纬度坐标的数据个数。</span></li><li><span>单击查询路线，自动返回对应路径的所有经纬度坐标。</span></li><li><span>单击帅选数据，按照填入的关键点数进行数据帅选，在下方可以看到原始数据和最终数据，选中某个数据，自动在左侧生成点预览对应的位置。</span></li><li><span>单击模拟轨迹，会启动定时器，从第一个数据点开始，自动移动设备比如机器人、飞行器等，查看整个轨迹点路径是否正确。</span></li></ol><p><img src="snap/4-5-1.jpg" referrerpolicy="no-referrer"></p><p><img src="snap/4-5-2.jpg" referrerpolicy="no-referrer"><span>  </span><img src="snap/4-5-3.jpg" referrerpolicy="no-referrer"><span>  </span><img src="snap/4-5-4.jpg" referrerpolicy="no-referrer"></p><h2 id='5-日志查询'><span>5 日志查询</span></h2><h3 id='51-本地日志'><span>5.1 本地日志</span></h3><p><img src="snap/5-1-1.jpg" referrerpolicy="no-referrer">
<span>	</span><span>本地日志存放的是本系统的操作日志，比如用户登录退出、记录删除、设备报警等操作，都会有对应的记录存放的数据库，可以在这里选择时间段和日志类型进行查询。查询后的日志记录可以翻页查看，还可以直接支持指定页码跳转，（此翻页组件超级牛逼，外观和功能分离，自动计算页码切换导航，具体可参见对应类的头文件功能描述），每页显示多少条记录在系统设置中可以设置。</span></p><h4 id='511-查询记录'><span>5.1.1 查询记录</span></h4><p><span>可以按照多条件进行查询记录，比如选择设备通道，选择日志的类型（用户操作、运行日志、设备日志、报警日志）、时间范围。</span>
<span>在查询记录的时候，如果勾选了前面的复选框则表示启用该选择条件进行查询，没有勾选，就算后面选择了类型等，也是按照where 1=1 条件查询的。</span>
<span>查询后的记录会自动分页显示，而不是一次性显示，可以单击底部的翻页按钮进行翻页查看记录，可以快速切换到第一页、末一页、上一页、下一页、显示的页码切换、指定的页码切换。</span></p><h4 id='512-打印记录'><span>5.1.2 打印记录</span></h4><p><img src="snap/5-1-2-1.jpg" referrerpolicy="no-referrer">
<span>单击打印按钮，会将当前查询的记录打印出来，自动分页。打印前会弹出打印预览对话框，可以最后在这里调整边距、纸张等设置参数。</span></p><h4 id='513-导出记录到xls'><span>5.1.3 导出记录到xls</span></h4><p><span>单击XLS按钮可以将表格中的内容导出到excel表格，独创的excel导出数据算法，极速导出，支持任意系统，无依赖。</span></p><p><img src="snap/5-1-3-1.jpg" referrerpolicy="no-referrer"></p><h4 id='514-导出记录到pdf'><span>5.1.4 导出记录到pdf</span></h4><p><img src="snap/5-1-4-1.jpg" referrerpolicy="no-referrer"></p><h4 id='515-删除记录'><span>5.1.5 删除记录</span></h4><p><img src="snap/5-1-5-1.jpg" referrerpolicy="no-referrer">
<span>单击删除按钮，会弹出时间范围选择对话框，选择要删除的记录的开始时间和结束时间，单击确定，会将该时间段内的记录全部删除，结束时间必须大于开始时间。</span></p><h4 id='516-清空记录'><span>5.1.6 清空记录</span></h4><p><span>单击清空按钮会先弹出询问框提示是否需要清空数据，单击确定则自动清空所有的记录，清空后不能恢复。</span></p><p><img src="snap/5-1-6-1.jpg" referrerpolicy="no-referrer"><span>  </span><img src="snap/5-1-6-2.jpg" referrerpolicy="no-referrer"></p><h3 id='52-设备日志'><span>5.2 设备日志</span></h3><p><img src="snap/5-2-1.jpg" referrerpolicy="no-referrer">
<span>设备日志是指直接通过sdk协议，远程从NVR设备上拉取日志记录到本地显示，其余功能和本地日志一致，此功能未实现。</span></p><h2 id='6-系统设置'><span>6 系统设置</span></h2><h3 id='61-系统设置'><span>6.1 系统设置</span></h3><p><span>系统设置主界面如下图：</span></p><p><img src="snap/6-1-1.jpg" referrerpolicy="no-referrer"></p><h4 id='611-基本设置'><span>6.1.1 基本设置</span></h4><p><img src="snap/6-1-1-1.jpg" referrerpolicy="no-referrer">
<strong><span>参数说明</span></strong></p><ol start='' ><li><span>开机运行：开启以后自动随着系统启动运行，默认开启。</span></li><li><span>自动登录：开启以后会自动以最后登录的用户信息登录到系统，默认关闭。</span></li><li><span>记住密码：开启以后会自动填入最后登录的用户信息到登录窗体，默认关闭。</span></li><li><span>中文标题：软件左上角标题栏的中文标题，改动立即应用。</span></li><li><span>英文标题：软件左上角标题栏的英文标题，改动立即应用。</span></li><li><span>版权所有：当前软件版权所有的公司，目前没有显示在哪里，备用。</span></li><li><span>全屏模式：开启以后，最大化显示自动全屏显示而不是最大化显示，默认关闭。</span></li><li><span>全屏适应：开启了以后会自动采用上移一个像素的办法解决opengl的BUG。</span></li><li><span>软件图标：自动从logo文件夹读取，可以自行选择对应的logo文件。</span></li><li><span>界面样式：系统自带17套皮肤，可以在这里自动换肤，默认视频黑。</span></li><li><span>工作模式：默认视频监控，可选机器人监控、无人机监控等。</span></li><li><span>导航样式：用于选择顶部导航栏和左侧导航栏的样式，上侧+左侧表示顶部导航栏上侧样式（图标在上面，文字在下面），左侧导航栏左侧样式（图标在左侧，文字在右侧）。</span></li><li><span>弹框时间：右下角弹出提示信息自动关闭时间，0秒表示常驻不关闭。</span></li><li><span>报警声音：0表示不启用，其余表示报警后播放的声音次数。</span></li><li><span>鼠标隐藏：主界面多久鼠标没有操作过会自动隐藏鼠标指针，一般在全屏轮询的时候需要设置，效果会更好。</span></li><li><span>自动全屏：经过多久以后鼠标没有操作过自动全屏，0表示不启用。</span></li><li><span>透明度值：停靠窗体的透明度值，可调节，动态应用。</span></li></ol><h4 id='612-视频参数'><span>6.1.2 视频参数</span></h4><p><img src="snap/6-1-2-1.jpg" referrerpolicy="no-referrer">
<strong><span>参数说明</span></strong></p><ol start='' ><li><span>保存视频：开启以后打开视频自动存储录像文件，目录在可执行文件video_normal。</span></li><li><span>存储间隔：录像文件按照什么规则存储视频，0分钟表示只存储到单个文件。</span></li><li><span>视频边框：视频控件的边框的宽度，值越大边框越粗。</span></li><li><span>报警视频：开启以后保存报警视频到可执行文件video_alarm，暂未启用。</span></li><li><span>硬件加速：当前视频内核采用何种硬件加速方式，默认none表示不启用硬件加速（常用的所有qsv、dxva2、d3d11va，建议用dxva2或者d3d11va，具体根据电脑是否支持定）。</span></li><li><span>通信方式：视频流采用何种通信方式，默认TCP（可靠连接，不会丢包，缺点就是慢），可选UDP（不可靠连接，容易丢包，但是速度快）。</span></li><li><span>视频回调：是否采用回调的形式来解码显示视频，比如vlc内核和海康内核都支持回调。</span></li><li><span>码流类型：双击摄像机以什么码流地址加载实时视频，默认子码流。</span></li><li><span>解码方式：ffmpeg内核有用，可选速度优先、质量优先、均衡处理。</span></li><li><span>播放音频：开启以后可以播放声音，有时候不需要声音的时候可以关闭，节省资源。</span></li><li><span>图片拉伸：默认开启，通道画面按照填充拉伸显示，不开启的话则按照等比例缩放。</span></li><li><span>打开间隔：软件启动后挨个加载打开视频的间隔，默认1秒钟。</span></li><li><span>重连间隔：软件多久检测一次摄像机是否掉线，默认10秒钟。</span></li><li><span>事件订阅：开启以后会用onvif的机制订阅报警事件。</span></li><li><span>自动校时：开启后摄像机上线立即同步本地时间到摄像机。</span></li></ol><h4 id='613-数据库设置'><span>6.1.3 数据库设置</span></h4><p><img src="snap/6-1-3-1.jpg" referrerpolicy="no-referrer">
<strong><span>参数说明</span></strong>
<span>默认提供了视频监控系统的数据库脚本文件（拓展名sql结尾的文件），单击初始化数据按钮可以对整个数据库进行新建和重置，相当于恢复出厂。</span>
<span>系统支持多种数据库，默认sqlite（Qt内置的数据库，无需安装），可选mysql、postgresql等，具体需要Qt对应的数据库插件支持，亲测下面的数据库。</span>
<span>除了sqlite数据库外，其余数据库都需要输入数据库名称、主机地址、通信端口、用户名称、用户密码信息，输入好以后可以单击连接测试按钮测试下是否正常。默认提供的是mysql的动态库libmysql.dll，需要放到可执行文件同一目录，严格区分32位和64位的动态库。</span></p><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="cpp"><div class="CodeMirror cm-s-inner CodeMirror-wrap" lang="cpp"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.29412px; left: 8.02942px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">//数据库类型枚举</span></span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">enum</span> <span class="cm-def">DbType</span> {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">DbType_ODBC</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>, &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">//odbc数据源</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">DbType_Sqlite</span> <span class="cm-operator">=</span> <span class="cm-number">1</span>, &nbsp; &nbsp; &nbsp;<span class="cm-comment">//sqlite数据库</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">DbType_MySql</span> <span class="cm-operator">=</span> <span class="cm-number">2</span>, &nbsp; &nbsp; &nbsp; <span class="cm-comment">//mysql数据库</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">DbType_PostgreSQL</span> <span class="cm-operator">=</span> <span class="cm-number">3</span>, &nbsp;<span class="cm-comment">//postgresql数据库</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">DbType_SqlServer</span> <span class="cm-operator">=</span> <span class="cm-number">4</span>, &nbsp; <span class="cm-comment">//sqlserver数据库</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">DbType_Oracle</span> <span class="cm-operator">=</span> <span class="cm-number">5</span>, &nbsp; &nbsp; &nbsp;<span class="cm-comment">//oracle数据库</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">DbType_KingBase</span> <span class="cm-operator">=</span> <span class="cm-number">6</span>, &nbsp; &nbsp;<span class="cm-comment">//人大金仓数据库</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">DbType_Other</span> <span class="cm-operator">=</span> <span class="cm-number">255</span> &nbsp; &nbsp; &nbsp;<span class="cm-comment">//其他数据库</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">};</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 248px;"></div><div class="CodeMirror-gutters" style="display: none; height: 248px;"></div></div></div></pre><h4 id='614-地图配置'><span>6.1.4 地图配置</span></h4><p><img src="snap/6-1-4-1.jpg" referrerpolicy="no-referrer">
<strong><span>参数说明</span></strong></p><ol start='' ><li><span>地图秘钥：对应百度地图的秘钥，默认内置的作者的秘钥，很多软件系统都用的这个秘钥，用户数较多，可能有并发限制，为了不影响体验，强烈建议改成自己的，可以自行去官网申请，免费。</span></li><li><span>地图中心：默认地图的中心点坐标。</span></li><li><span>地图级别：默认地图打开以后的缩放级别。</span></li></ol><h4 id='615-功能激活'><span>6.1.5 功能激活</span></h4><p><img src="snap/6-1-5-1.jpg" referrerpolicy="no-referrer">
<strong><span>参数说明</span></strong>
<span>勾选则表示启用，可以对各种分屏进行功能激活，需要重启应用，没有勾选的，不会显示对应的菜单切换和分屏快捷按钮。多个子界面模块也可以选择显示或者隐藏，以便将不需要的模块隐藏掉，碍眼。</span></p><h4 id='616-颜色配置'><span>6.1.6 颜色配置</span></h4><p><img src="snap/6-1-6-1.jpg" referrerpolicy="no-referrer">
<strong><span>参数说明</span></strong>
<span>可以设置不同的场景不同的颜色，比如正常的系统消息显示白色，异常消息红色。</span></p><h4 id='617-串口配置'><span>6.1.7 串口配置</span></h4><p><img src="snap/6-1-7-1.jpg" referrerpolicy="no-referrer">
<strong><span>参数说明</span></strong>
<span>系统中可能用到了多个串口通信，可以在这里选择对应的串口号和波特率。</span></p><h4 id='618-网络配置'><span>6.1.8 网络配置</span></h4><p><img src="snap/6-1-8-1.jpg" referrerpolicy="no-referrer">
<strong><span>参数说明</span></strong>
<span>系统中可能用到多种网络通信，比如软件主动连接服务器，需要填写TCP地址和端口，也可能软件作为服务端，填写TCP或者UDP监听端口。</span></p><p>&nbsp;</p><h3 id='62-录像机管理'><span>6.2 录像机管理</span></h3><p><span>本系统所用的录像机信息，并没有实际的作用，也就是不一定要填写实际的录像机信息，留作备用后期使用，目前仅仅是作为生成设备的树状列表使用（类似于区域），如果一个录像机都没有填写，则会自动生成一个默认的录像机信息。</span></p><p><img src="snap/6-2-1.jpg" referrerpolicy="no-referrer">
<strong><span>字段说明</span></strong></p><ol start='' ><li><span>设备编号：录像机的编号，唯一字段。</span></li><li><span>设备名称：录像机的别名，建议不要重复。</span></li><li><span>设备类型：录像机的厂家类型，可选海康、大华、宇视、其他等。</span></li><li><span>设备地址：录像机的IP地址。</span></li><li><span>用户姓名：录像机的登录用户名称。</span></li><li><span>用户密码：录像机的登录用户密码。</span></li><li><span>启用状态：录像机设备是否启用。</span></li><li><span>安装位置：录像机的安装位置。</span></li></ol><h4 id='621-录像机添加'><span>6.2.1 录像机添加</span></h4><p><span>单击添加按钮，会自动规则生成默认的信息，直接表格中修改即可，修改好以后单击保存按钮保存所有的信息。</span></p><h4 id='622-录像机删除'><span>6.2.2 录像机删除</span></h4><p><span>如果要删除某个设备，需要先选中该设备，然后单击删除按钮，删除后会自动保存。</span></p><h4 id='623-录像机清空'><span>6.2.3 录像机清空</span></h4><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang=""><div class="CodeMirror cm-s-inner CodeMirror-wrap" lang=""><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.29412px; left: 8.02942px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation"><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">单击清空按钮会对整个表进行清空操作，清空后数据不能恢复，慎用。</span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 23px;"></div><div class="CodeMirror-gutters" style="display: none; height: 23px;"></div></div></div></pre><h4 id='624-录像机信息导入'><span>6.2.4 录像机信息导入</span></h4><p><span>单击导入按钮，可以选择之前导出的csv格式的文件导入数据。</span></p><h4 id='625-录像机信息导出'><span>6.2.5 录像机信息导出</span></h4><p><span>单击导出按钮，将表格数据导出到csv格式的文件，用户可以打开文件编辑，然后再次导入，这样可以作为简易的备份机制使用，也可将繁琐的基础数据录入交给小姑娘去做。</span></p><h4 id='626-录像机信息打印'><span>6.2.6 录像机信息打印</span></h4><p><span>单击打印按钮可以将表格中的内容打印出来，打印前会弹出打印预览界面，可以自行做边距的调整等，可以查看等待打印的内容，翻页切换。</span></p><h4 id='627-导出到excel'><span>6.2.7 导出到Excel</span></h4><p><span>单击导出按钮可以将表格中的内容导出到excel表格，独创的excel导出数据算法，极速导出，支持任意系统，无依赖。</span></p><p><img src="snap/6-2-7-1.jpg" referrerpolicy="no-referrer">
<img src="snap/6-2-7-2.jpg" referrerpolicy="no-referrer"></p><h3 id='63-摄像机管理'><span>6.3 摄像机管理</span></h3><p><span>摄像机表信息，是整个系统中最核心的表，这里管理的所有的摄像机信息，并不是所有的字段都显示出来了，比如onvif地址、云台地址等都是隐藏的，因为无需添加更改，需要搜索自动添加的。</span></p><p><img src="snap/6-3-1.jpg" referrerpolicy="no-referrer">
<strong><span>字段说明</span></strong></p><ol start='' ><li><span>设备编号：摄像机的唯一编号。</span></li><li><span>设备名称：摄像机的别名，建议不要重复。</span></li><li><span>录 像 机：该摄像机对应所属的录像机，随便选择一个就行。</span></li><li><span>设备厂家：摄像机的厂家类型，通过onvif搜索会自动有厂家信息，没有的就选择其他。</span></li><li><span>主码流地址：摄像机的主码流地址。</span></li><li><span>子码流地址：摄像机的子码流地址。</span></li><li><span>经 纬 度：摄像机的经纬度信息，用来地图上显示位置，中间用 | 隔开。</span></li><li><span>背景地图：摄像机对应的平面地图，下拉选择。</span></li><li><span>用户姓名：摄像机登录的用户名称。</span></li><li><span>用户密码：摄像机登录的用户密码。</span></li><li><span>启用状态：摄像机是否启用。</span></li><li><span>安装位置：摄像机的安装位置。</span></li></ol><h4 id='631-摄像机添加'><span>6.3.1 摄像机添加</span></h4><p><span>单击添加按钮，会自动规则生成默认的信息，直接表格中修改即可，修改好以后单击保存按钮保存所有的信息。</span></p><h4 id='632-摄像机删除'><span>6.3.2 摄像机删除</span></h4><p><span>如果要删除某个设备，需要先选中该设备，然后单击删除按钮，删除后会自动保存。</span></p><h4 id='633-摄像机清空'><span>6.3.3 摄像机清空</span></h4><p><span>单击清空按钮会对整个表进行清空操作，清空后数据不能恢复，慎用。</span></p><h4 id='634-摄像机信息导入'><span>6.3.4 摄像机信息导入</span></h4><p><span>单击导入按钮，可以选择之前导出的csv格式的文件导入数据。</span></p><h4 id='635-摄像机信息导出'><span>6.3.5 摄像机信息导出</span></h4><p><span>单击导出按钮，将表格数据导出到csv格式的文件，用户可以打开文件编辑，然后再次导入，这样可以作为简易的备份机制使用，也可将繁琐的基础数据录入交给小姑娘去做。</span></p><h4 id='636-摄像机信息打印'><span>6.3.6 摄像机信息打印</span></h4><p><span>单击打印按钮可以将表格中的内容打印出来，打印前会弹出打印预览界面，可以自行做边距的调整等，可以查看等待打印的内容，翻页切换。</span></p><h4 id='637-导出到excel'><span>6.3.7 导出到Excel</span></h4><p><span>单击导出按钮可以将表格中的内容导出到excel表格，独创的excel导出数据算法，极速导出，支持任意系统，无依赖。</span></p><p><img src="snap/6-3-7-1.jpg" referrerpolicy="no-referrer">
<img src="snap/6-3-7-2.jpg" referrerpolicy="no-referrer"></p><h4 id='638-设备搜索'><span>6.3.8 设备搜索</span></h4><p><img src="snap/6-3-8-1.jpg" referrerpolicy="no-referrer">
<span>如果摄像机已经添加过，则搜索出来的摄像机信息行背后颜色突出显示并且不可选中。</span></p><p><img src="snap/6-3-8-2.jpg" referrerpolicy="no-referrer">
<strong><span>基本步骤</span></strong></p><ol start='' ><li><span>第一步：单击广播搜索按钮，搜索到的设备会显示在左侧表格中。</span></li><li><span>第二步：输入onvif用户名和密码，注意是onvif的用户信息，一个摄像机可能有多种用户，比如登录用户，远程用户，onvif用户，务必记得要用onvif用户信息，可参阅说明书的末尾海康大华的onvif设置。</span></li><li><span>第三步：单击获取所有，会自动以填写的onvif用户信息，去拉取具体摄像机的码流地址、云台地址等信息，可以拉动底部的横向滚动条查看具体是否获取到信息。</span></li><li><span>第四步：单击添加选中按钮将所有勾选了复选框的设备添加到摄像机信息表中。</span></li></ol><p><strong><span>特别说明</span></strong></p><ol start='' ><li><span>如果没有码流地址，是添加不了的，必须有码流地址才能添加。</span></li><li><span>一般一个项目上的摄像机都是同一个品牌的，onvif用户信息也都一样，所以单击获取所有可以把所有摄像机的信息获取到。</span></li><li><span>可以填入不同的onvif用户信息，单击获取当前按钮来指定摄像机获取onvif信息。</span></li><li><span>如果有些设备不支持广播，只支持单播（比如不是同一网段的设备，但是路由器设置过，是通的），则指定设备右侧填写好IP地址或者onvif地址，再单击单播搜索即可。</span></li><li><span>一台电脑可能多个网卡和IP网段，可以选择不同的网卡进行搜索。</span></li><li><span>录像机信息和摄像机信息的更改，是自动应用的，无需重启。</span></li><li><span>搜索后的设备信息自动添加到表格中，按照IP地址升序排序，支持跨网段排序，自动将IP地址转为quint32整型进行排序，而不是取IP地址末尾。</span></li></ol><p><img src="snap/6-3-8-3.jpg" referrerpolicy="no-referrer">
<strong><span>参数说明</span></strong></p><ol start='' ><li><span>用户姓名：onvif用户的名称，默认admin。</span></li><li><span>用户密码：onvif用户的密码，默认admin。</span></li><li><span>选择网卡：选择对应电脑的网卡IP，可能有多个网段，onvif只能同一个网段。</span></li><li><span>指定设备：对指定的IP地址或者onvif地址进行onvif搜索。</span></li><li><span>过滤设备：对返回的onvif地址进行过滤，一种厂家的类别的设备地址格式一样。</span></li><li><span>搜索间隔：默认onvif搜索指令有好几种，会重发几次，指定发送的间隔。</span></li><li><span>搜索策略：默认自动清空，每次都重新添加搜索到的设备，如果选择设备累加则多次搜索后只会将新增加的设备加到设备列表，这个非常有用，在很多设备现场建议用设备累加策略而不是自动清空，因为onvif协议是udp协议，在大量数据的情况下会导致丢包，需要多次搜索，取最终的设备集合。</span></li><li><span>广播搜索：广播搜索指定网卡的所有onvif设备。</span></li><li><span>单播搜索：对指定设备进行单个搜索。</span></li><li><span>获取所有：按照当前填入的用户姓名和密码，填充到onvif请求鉴权中对所有搜索的设备进行媒体地址的获取、云台控制地址的获取、视频流地址的获取等。</span></li><li><span>获取当前：很多时候并不是所有的设备onvif用户信息一样，对于不一样的，可以先选中设备所在行，然后输入不同的用户信息，单击获取当前即可，会对当前选中的设备重新获取onvif信息。</span></li><li><span>添加选中：搜索到的设备前面都有个复选框，单击添加选中以后会对所有打钩的设备批量添加到摄像机信息表中，会自动过滤已经添加过的设备以及没有视频流地址的设备。</span></li><li><span>添加当前：对应获取当前，一般来说单个添加用户信息不一样的设备，因为批量添加不了，他的信息需要单独获取。</span></li></ol><p>&nbsp;</p><h3 id='64-轮询配置'><span>6.4 轮询配置</span></h3><p><img src="snap/6-4-1.jpg" referrerpolicy="no-referrer">
<span>轮询点管理界面，上侧是轮询点信息表，可以直接添加、删除、修改、清空轮询点信息，下侧是摄像机信息表，会自动加载，当摄像机信息变动后，这里会自动加载最新的数据。右下角是批量生成轮询点和轮询分组管理。</span></p><h4 id='641-轮询点添加'><span>6.4.1 轮询点添加</span></h4><p><span>轮询点的添加有三种方式：手动添加、单个添加、批量添加。</span>
<span>允许重复添加，没有过滤机制。</span></p><ol start='' ><li><span>手动添加：单击添加按钮，在右侧轮询信息表格中自动生成默认轮询点信息，手动输入和修改信息然后单击保存按钮即可。</span></li><li><span>单个添加：左侧摄像机信息表中选中一行，单击添加当前按钮，会将选中的摄像机信息添加到右侧轮询点信息中，自动保存。</span></li><li><span>批量添加：单击添加所有按钮，会将所有摄像机信息添加到右侧轮询点信息中，自动保存。</span></li></ol><h4 id='642-轮询点删除'><span>6.4.2 轮询点删除</span></h4><p><span>如果要删除某个轮询点，需要先选中该轮询点，然后单击删除按钮，删除后会自动保存。</span></p><h4 id='643-轮询点清空'><span>6.4.3 轮询点清空</span></h4><p><span>单击清空按钮会对整个表进行清空操作，清空后数据不能恢复，慎用。</span></p><h4 id='644-轮询点信息导入'><span>6.4.4 轮询点信息导入</span></h4><p><span>单击导入按钮，可以选择之前导出的csv格式的文件导入数据。</span></p><h4 id='645-轮询点信息导出'><span>6.4.5 轮询点信息导出</span></h4><p><span>单击导出按钮，将表格数据导出到csv格式的文件，用户可以打开文件编辑，然后再次导入，这样可以作为简易的备份机制使用，也可将繁琐的基础数据录入交给小姑娘去做。</span></p><h4 id='645-轮询点信息打印'><span>6.4.5 轮询点信息打印</span></h4><p><span>单击打印按钮可以将表格中的内容打印出来，打印前会弹出打印预览界面，可以自行做边距的调整等，可以查看等待打印的内容，翻页切换。</span></p><h4 id='647-导出到excel'><span>6.4.7 导出到Excel</span></h4><p><span>单击导出按钮可以将表格中的内容导出到excel表格，独创的excel导出数据算法，极速导出，支持任意系统，无依赖。</span></p><h4 id='648-参数设置'><span>6.4.8 参数设置</span></h4><p><img src="snap/6-4-8-1.jpg" referrerpolicy="no-referrer">
<strong><span>参数说明</span></strong></p><ol start='' ><li><span>自动轮询：开启以后，启动软件后自动轮询。</span></li><li><span>轮询间隔：画面切换的间隔，单位秒，建议时间长一点。</span></li><li><span>轮询画面：轮询的画面数，可选1画面、4画面、9画面、16画面。</span></li><li><span>码流类型：默认子码流，超过4画面建议子码流。</span></li></ol><h4 id='649-批量生成'><span>6.4.9 批量生成</span></h4><p><img src="snap/6-4-9-1.jpg" referrerpolicy="no-referrer"><span>  </span><img src="snap/6-4-9-2.jpg" referrerpolicy="no-referrer"><span>  </span><img src="snap/6-4-9-3.jpg" referrerpolicy="no-referrer">
<span>轮询表信息可以通过已添加的摄像机信息表选中添加，也可以自定义规则批量生成视频流地址添加，这种应用场景非常多，比如现场是某一种品牌的摄像机，视频流格式固定，只需要设置好主码流子码流的视频流格式，便可批量生成。</span>
<strong><span>参数说明</span></strong></p><ol start='' ><li><span>生成数量： 需要批量生成多少个。</span></li><li><span>起始地址：如果选择的是文件，则填写对应的数字，其他则填写IP地址。</span></li><li><span>地址格式：可选各种厂家类型，还可选择文件，这个用于测试软件非常有用。</span></li></ol><h4 id='6410-分组设置'><span>6.4.10 分组设置</span></h4><p><img src="snap/6-4-10-1.jpg" referrerpolicy="no-referrer">
<strong><span>参数说明</span></strong>
<span>可添加、删除、修改、清空轮询分组名称，相当于轮询预案。</span></p><p>&nbsp;</p><h3 id='65-用户管理'><span>6.5 用户管理</span></h3><p><span>用户管理是后面增加的一个模块，用于设置不同的用户不同的类型+权限，可以细分到每个模块的权限，勾选表示具有该权限，内置了7种权限选择，后期还可以在此基础上增加其他权限等。</span></p><p><img src="snap/6-5-1.jpg" referrerpolicy="no-referrer"></p><h4 id='651-用户添加'><span>6.5.1 用户添加</span></h4><p><span>单击添加按钮，会自动规则生成默认的信息，直接表格中修改即可，修改好以后单击保存按钮保存所有的信息。</span></p><h4 id='652-用户删除'><span>6.5.2 用户删除</span></h4><p><span>如果要删除某个用户，需要先选中该用户，然后单击删除按钮，删除后会自动保存。不允许删除内置的admin用户。</span></p><h4 id='653-用户清空'><span>6.5.3 用户清空</span></h4><p><span>单击清空按钮会对整个表进行清空操作，清空后数据不能恢复，慎用。</span></p><h4 id='654-用户信息导入'><span>6.5.4 用户信息导入</span></h4><p><span>单击导入按钮，可以选择之前导出的csv格式的文件导入数据。</span></p><h4 id='655-用户信息导出'><span>6.5.5 用户信息导出</span></h4><p><span>单击导出按钮，将表格数据导出到csv格式的文件，用户可以打开文件编辑，然后再次导入，这样可以作为简易的备份机制使用，也可将繁琐的基础数据录入交给小姑娘去做。</span></p><h4 id='656-用户信息打印'><span>6.5.6 用户信息打印</span></h4><p><span>单击打印按钮可以将表格中的内容打印出来，打印前会弹出打印预览界面，可以自行做边距的调整等，可以查看等待打印的内容，翻页切换。</span></p><p><img src="snap/6-5-6-1.jpg" referrerpolicy="no-referrer"></p><h4 id='657-导出到excel'><span>6.5.7 导出到Excel</span></h4><p><span>单击导出按钮可以将表格中的内容导出到excel表格，独创的excel导出数据算法，极速导出，支持任意系统，无依赖。</span></p><p><img src="snap/6-5-7-1.jpg" referrerpolicy="no-referrer"></p><h4 id='658-权限验证'><span>6.5.8 权限验证</span></h4><p><span>假设设置了用户没有退出系统和电子地图的权限，则关闭系统的时候会弹出错误信息提示当前用户没有权限。</span></p><p><img src="snap/6-5-8-1.jpg" referrerpolicy="no-referrer"><span>  </span><img src="snap/6-5-8-2.jpg" referrerpolicy="no-referrer"></p><p>&nbsp;</p><h2 id='7-简易使用步骤'><span>7 简易使用步骤</span></h2><h3 id='71-添加摄像机'><span>7.1 添加摄像机</span></h3><ol start='' ><li><span>切换到系统设置-》摄像机管理，单击添加，输入码流地址，单击保存。</span></li><li><span>在不知道主码流和子码流是啥的情况下，两个地方填一样的，其余默认即可。</span></li><li><span>本地文件格式：g:/mp4/1.mp4</span></li><li><span>USB摄像机：默认ffmpeg内核为 video=USB2.0 PC CAMERA（具体要看设备名） 如果是vlc内核则为 dshow://:dshow-vdev=&#39;Default&#39;</span></li><li><span>摄像机视频流：直接填入rtsp、rtmp、http的视频流地址，该地址可以先用vlc播放器或者potplay等播放器先试试是否能正常播放，不能的话就别添加了，添加了也没卵用，别费力气了。</span></li></ol><h3 id='72-视频播放'><span>7.2 视频播放</span></h3><p><span>切换到视频监控主界面，左侧设备列表，双击摄像机，自动通道播放，双击录像机则整个录像机下面的摄像机全部加载。</span></p><h3 id='73-云台控制'><span>7.3 云台控制</span></h3><p><span>云台控制的前提是摄像机是通过onvif搜索的形式添加的，不然没有云台地址没法进行云台控制，当然也必须要求摄像机带云台，不带云台的摄像机是不能进行云台控制的。</span>
<span>先选中要进行云台控制的摄像机通道，边缘高亮，然后再单击右侧的云台控件，可以上下左右等移动，变倍和光圈没有用。</span></p><h3 id='74-自动校时'><span>7.4 自动校时</span></h3><p><span>在系统设置中开启自动校时后，设备自动上线后会自动将本地时间同步到设备。</span></p><h3 id='75-事件订阅'><span>7.5 事件订阅</span></h3><p><span>在系统设置中开启事件订阅后，一旦接收到设备的报警信息会显示到主界面左下角的信息栏，右下角弹出对应的报警信息。</span>
<span>摄像机要响应事件订阅，具体详细设置说明参见说明书其他说明中的摄像机报警输入设置。</span></p><h3 id='76-图片参数'><span>7.6 图片参数</span></h3><p><img src="snap/7-6-1.jpg" referrerpolicy="no-referrer">
<span>用onvif也可以对摄像机的明亮度、对比度、饱和度进行设置，和云台控制的操作类型，先选中对应的通道，然后右下角这里找到设置的区域，单击获取参数，会自动将对应摄像机的明亮度、对比度、饱和度值读回来，显示在对应文本框和滑块中。</span>
<span>如果需要设置图片参数，先移动滑块到需要的值，然后单击设置参数按钮即可，设置完以后会立即应用，传过来的视频流就能看到效果。</span>
<span>下面还有两个按钮可以手动重启设备以及校时。</span></p><h2 id='8-内核模块说明'><span>8 内核模块说明</span></h2><p><span>本系统支持多种内核，方便不同的用户选择，适应不同的应用场景，默认提供的是ffmpeg内核和vlc内核，其他内核需要额外购买或者定制，支持定制内核。</span>
<span>每个内核实现的功能不一定完全一致，可仔细查看后面的每个内核的功能特点说明。</span></p><h3 id='81-模块-onvif'><span>8.1 模块-onvif</span></h3><h4 id='811-效果图'><span>8.1.1 效果图</span></h4><p><img src="snap/8-1-1-1.jpg" referrerpolicy="no-referrer"></p><h4 id='812-功能介绍'><span>8.1.2 功能介绍</span></h4><ol start='' ><li><span>广播搜索设备，支持IPC和NVR，依次返回，可选择不同的网卡IP。</span></li><li><span>依次获取Onvif地址、Media地址、Profile文件、Rtsp地址。</span></li><li><span>可对指定的Profile获取视频流Rtsp地址，比如主码流子码流地址。</span></li><li><span>可对每个设备设置Onvif用户信息，用于认证获取详细信息。</span></li><li><span>可实时预览摄像机图像。</span></li><li><span>支持云台控制，可上下左右调节云台，支持绝对移动和相对移动，可放到和缩小图像远近。</span></li><li><span>支持Qt4和Qt5任意Qt版本，亲测Qt4.7.0到Qt5.12.4。</span></li><li><span>支持任意编译器，亲测mingw、msvc、gcc、clang。</span></li><li><span>支持任意操作系统，亲测xp、win7、win10、linux、嵌入式linux、树莓派全志H3等。</span></li><li><span>支持任意Onvif摄像机和NVR，亲测海康、大华、宇视、华为、海思芯片内核等，可定制开发。</span></li><li><span>支持对指定IP地址进行单播搜索，比如跨网段情况下非常有用。</span></li><li><span>纯Qt编写，超级小巧轻量，总共约2000行代码，不依赖任何第三方的库和组件，跨平台。</span></li><li><span>封装好了通用的数据发送和接收解析的函数，可以非常方便的自行拓展其他Onvif处理比如修改IP等。</span></li><li><span>工具上提供了收发数据文本框，显示收发的数据，方便查看和分析。</span></li><li><span>支持所有Onvif设备，代码工整，接口友好，直接引入pri即可使用。</span></li></ol><h4 id='813-云台说明'><span>8.1.3 云台说明</span></h4><ol start='' ><li><span>x、y、z 范围都在0-1之间。</span></li><li><span>x为负数，表示左转，x为正数，表示右转。</span></li><li><span>y为负数，表示下转，y为正数，表示上转。</span></li><li><span>z为正数，表示拉近，z为负数，表示拉远。</span></li><li><span>通过x和y的组合，来实现云台的控制。</span></li><li><span>通过z的组合，来实现焦距控制。</span></li></ol><h4 id='814-主要功能'><span>8.1.4 主要功能</span></h4><ol start='' ><li><span>搜索设备，获取设备的信息比如厂家、型号等。</span></li><li><span>获取设备的多个配置文件信息profile。</span></li><li><span>获取对应配置文件的视频流地址rtsp，以及分辨率等参数。</span></li><li><span>云台控制，上下左右移动，焦距放大缩小，相对和绝对移动。</span></li><li><span>获取预置位信息，触发预置位。</span></li><li><span>订阅事件，接收设备的各种消息尤其是报警事件比如IO口的报警。</span></li><li><span>抓图，获取设备当前的图片。</span></li><li><span>获取、创建、删除用户信息。</span></li><li><span>获取和设备网络配置信息比如IP地址等。</span></li><li><span>获取和设置NTP时间同步。</span></li><li><span>获取和设置设备时间。</span></li><li><span>重启设备。</span></li></ol><h4 id='815-处理流程'><span>8.1.5 处理流程</span></h4><ol start='' ><li><span>绑定组播IP（239.255.255.250）和端口（3702），发送固定的xml格式的数据搜索设备。</span></li><li><span>接收到的xml格式的数据解析，得到设备的Onvif地址。</span></li><li><span>对Onvif地址发送对应的数据，收到数据取出对应的节点数据。</span></li><li><span>请求Onvif地址获取Media地址和Ptz地址，Media地址用来获取详细的配置文件，Ptz地址用来云台控制。</span></li><li><span>ptz控制是对Ptz地址发送对应的数据即可。</span></li><li><span>设置了用户认证的需要组织用户token信息一块发送，每次都需要作鉴权处理。</span></li><li><span>接收到的数据不是标准的xml数据，没法按照正常的节点解析来处理，只能用QXmlQuery来做。</span></li><li><span>每个厂家设备返回的数据未必完全一致，基本上都不一致，需要进行模糊查找节点值。</span></li><li><span>特意采用底层协议解析，因为soap太臃肿函数名称太另类，特意做的轻量级的。</span></li><li><span>两个必备工具，Onvif Device Manager 和 Onvif Device Test Tool。</span></li></ol><h3 id='82-内核-ffmpeg'><span>8.2 内核-ffmpeg</span></h3><h4 id='821-效果图'><span>8.2.1 效果图</span></h4><p><img src="snap/8-2-1-1.jpg" referrerpolicy="no-referrer"></p><h4 id='822-功能介绍'><span>8.2.2 功能介绍</span></h4><ol start='' ><li><span>多线程实时播放视频流+本地视频+USB摄像头等。</span></li><li><span>支持windows+linux+mac，支持ffmpeg3和ffmpeg4，支持32位和64位。</span></li><li><span>多线程显示图像，不卡主界面。</span></li><li><span>自动重连网络摄像头。</span></li><li><span>可设置边框大小即偏移量和边框颜色。</span></li><li><span>可设置是否绘制OSD标签即标签文本或图片和标签位置。</span></li><li><span>可设置两种OSD位置和风格。</span></li><li><span>可设置是否保存到文件以及文件名。</span></li><li><span>可直接拖曳文件到ffmpegwidget控件播放。</span></li><li><span>支持h265视频流+rtmp等常见视频流。</span></li><li><span>可暂停播放和继续播放。</span></li><li><span>支持存储单个视频文件和定时存储视频文件。</span></li><li><span>自定义顶部悬浮条，发送单击信号通知，可设置是否启用。</span></li><li><span>可设置画面拉伸填充或者等比例填充。</span></li><li><span>可设置解码是速度优先、质量优先、均衡处理。</span></li><li><span>可对视频进行截图（原始图片）和截屏。</span></li><li><span>录像文件存储支持裸流和MP4文件。</span></li><li><span>音视频完美同步，采用外部时钟同步策略。</span></li><li><span>支持seek定位播放位置。</span></li><li><span>支持在线网络音视频文件比如http开头mp4、mp3结尾的。</span></li><li><span>可选句柄模式（GPU绘制）、回调模式（QPainter绘制）。</span></li><li><span>GPU绘制模式同时支持拉伸和等比例绘制。</span></li><li><span>支持qsv、dxva2、d3d11va等硬解码。</span></li><li><span>硬解码和GPU组合，超低CPU占用，支持64路视频。</span></li><li><span>支持安卓和嵌入式linux，交叉编译即可。</span></li></ol><h3 id='83-内核-vlc'><span>8.3 内核-vlc</span></h3><h4 id='831-效果图'><span>8.3.1 效果图</span></h4><p><img src="snap/8-3-1-1.jpg" referrerpolicy="no-referrer"></p><h4 id='832-功能介绍'><span>8.3.2 功能介绍</span></h4><ol start='' ><li><span>多线程实时播放视频流+本地视频+USB摄像头等。</span></li><li><span>支持windows+linux+mac，支持vlc2和vlc3，支持32位和64位。</span></li><li><span>多线程显示图像，不卡主界面。</span></li><li><span>自动重连网络摄像头。</span></li><li><span>可设置边框大小即偏移量和边框颜色。</span></li><li><span>可设置是否绘制OSD标签即标签文本或图片和标签位置。</span></li><li><span>可设置两种OSD位置和风格。</span></li><li><span>可设置是否保存到文件以及文件名。</span></li><li><span>可直接拖曳文件到vlcwidget控件播放。</span></li><li><span>支持h265视频流+rtmp等常见视频流。</span></li><li><span>可暂停播放和继续播放。</span></li><li><span>支持回调模式和句柄两种模式。</span></li><li><span>支持线程读取进度等信息和事件回调两种处理模式。</span></li><li><span>自动将当前播放位置和音量大小是否静音以信号发出去。</span></li><li><span>提供接口设置播放位置和音量及设置静音。</span></li><li><span>支持存储单个视频文件和定时存储视频文件。</span></li><li><span>自定义顶部悬浮条，发送单击信号通知，可设置是否启用。</span></li><li><span>支持auto、any、dxva2、d3d11va等硬解码。</span></li></ol><h3 id='84-内核-mpv'><span>8.4 内核-mpv</span></h3><p><span>不自带，需要额外购买此模块。</span></p><h4 id='841-效果图'><span>8.4.1 效果图</span></h4><p><img src="snap/8-4-1-1.jpg" referrerpolicy="no-referrer"></p><h4 id='842-功能介绍'><span>8.4.2 功能介绍</span></h4><ol start='' ><li><span>多线程实时播放视频流+本地视频等。</span></li><li><span>支持windows+linux+mac。</span></li><li><span>多线程显示图像，不卡主界面。</span></li><li><span>自动重连网络摄像头。</span></li><li><span>可设置是否保存到文件以及文件名。</span></li><li><span>可直接拖曳文件到mpvwidget控件播放。</span></li><li><span>支持h265视频流+rtmp等常见视频流。</span></li><li><span>可暂停播放和继续播放。</span></li><li><span>支持存储单个视频文件和定时存储视频文件。</span></li><li><span>自定义顶部悬浮条，发送单击信号通知，可设置是否启用。</span></li><li><span>可设置画面拉伸填充或者等比例填充。</span></li><li><span>可对视频进行截图（原始图片）和截屏。</span></li><li><span>录像文件存储MP4文件。</span></li><li><span>支持qsv、dxva2、d3d11va等硬解码。</span></li></ol><h3 id='85-内核-海康sdk'><span>8.5 内核-海康sdk</span></h3><p><span>不自带，需要额外购买此模块。</span></p><h4 id='851-效果图'><span>8.5.1 效果图</span></h4><p><img src="snap/8-5-1-1.jpg" referrerpolicy="no-referrer"></p><h4 id='852-功能介绍'><span>8.5.2 功能介绍</span></h4><ol start='' ><li><span>支持播放视频流和本地MP4文件。</span></li><li><span>支持句柄和回调两种模式。</span></li><li><span>多线程显示图像，不卡主界面。</span></li><li><span>自动重连网络摄像头。</span></li><li><span>可设置边框大小即偏移量和边框颜色。</span></li><li><span>可设置是否绘制OSD标签即标签文本或图片和标签位置。</span></li><li><span>可设置两种OSD位置和风格。</span></li><li><span>可设置是否保存到文件以及文件名。</span></li><li><span>可直接拖曳文件到haikangwidget控件播放。</span></li><li><span>支持h264/h265视频流。</span></li><li><span>可暂停播放和继续播放。</span></li><li><span>支持存储单个视频文件和定时存储视频文件。</span></li><li><span>自定义顶部悬浮条，发送单击信号通知，可设置是否启用。</span></li><li><span>可设置画面拉伸填充或者等比例填充。</span></li><li><span>可设置解码是速度优先、质量优先、均衡处理。</span></li><li><span>可对视频进行截图（原始图片）和截屏（视频窗体）。</span></li><li><span>录像文件存储为MP4文件。</span></li><li><span>支持焦距控制、云台控制。</span></li><li><span>可定制功能。</span></li></ol><p><span>下面没有列出功能介绍的是暂时没有实现的内核</span></p><h3 id='86-内核-萤石sdk'><span>8.6 内核-萤石sdk</span></h3><h3 id='87-内核-大华sdk'><span>8.7 内核-大华sdk</span></h3><h3 id='88-内核-宇视sdk'><span>8.8 内核-宇视sdk</span></h3><h3 id='89-内核-easyplayer'><span>8.9 内核-easyplayer</span></h3><h3 id='810-内核-大牛直播'><span>8.10 内核-大牛直播</span></h3><h3 id='811-内核-qtav'><span>8.11 内核-qtav</span></h3><p>&nbsp;</p><h2 id='9-主界面模块说明'><span>9 主界面模块说明</span></h2><p><span>本系统主界面采用QMainWindow停靠窗体模式设计，这样可以自定义各种各样的子模块停靠悬浮等，不同的工作模式可以对应不同的模块，甚至可以拓展成不同的用户权限对应不同的主界面模块。所有子模块都是new出来的，支持任意多个。</span></p><h3 id='90-主界面'><span>9.0 主界面</span></h3><h4 id='901-视频监控-普通模式'><span>9.0.1 视频监控-普通模式</span></h4><p><img src="snap/9-0-1-1.jpg" referrerpolicy="no-referrer"></p><h4 id='902-视频监控-全屏模式'><span>9.0.2 视频监控-全屏模式</span></h4><p><img src="snap/9-0-2-1.jpg" referrerpolicy="no-referrer"></p><h4 id='903-机器人监控-普通模式'><span>9.0.3 机器人监控-普通模式</span></h4><p><img src="snap/9-0-3-1.jpg" referrerpolicy="no-referrer"></p><h4 id='904-机器人监控-全屏模式'><span>9.0.4 机器人监控-全屏模式</span></h4><p><img src="snap/9-0-4-1.jpg" referrerpolicy="no-referrer"></p><h4 id='905-无人机监控-普通模式'><span>9.0.5 无人机监控-普通模式</span></h4><p><img src="snap/9-0-5-1.jpg" referrerpolicy="no-referrer"></p><h4 id='906-无人机监控-全屏模式'><span>9.0.6 无人机监控-全屏模式</span></h4><p><img src="snap/9-0-6-1.jpg" referrerpolicy="no-referrer"></p><p>&nbsp;</p><h3 id='91-设备列表'><span>9.1 设备列表</span></h3><p><img src="snap/9-1-1.jpg" referrerpolicy="no-referrer">
<span>设备列表通过读取录像机信息（生成父节点，相当于区域，录像机信息本身在整个系统中目前就一个作为设备列表的区域信息功能，用户可以自行拓展作为其他用途。）、摄像机信息，自动生成设备列表，每个摄像机都对应一个主码流和子码流，支持各种视频流、本地视频文件、USB摄像机等。</span></p><h3 id='92-窗口信息'><span>9.2 窗口信息</span></h3><p><img src="snap/9-2-1.jpg" referrerpolicy="no-referrer">
<span>窗口信息负责显示一些打印信息，比如串口是否打开成功，摄像机是否异常，各种报警日志等，可以在系统设置中设置不同的文字颜色，窗口信息的信息条数自动计算应用，保证最大可能的适应高度。</span></p><h3 id='93-图文警情'><span>9.3 图文警情</span></h3><p><img src="snap/9-3-1.jpg" referrerpolicy="no-referrer">
<span>图文警情模块负责以图文的形式显示对应的警情或者提示信息，有时间、内容、图片，双击对应图片可以放大查看具体图片，为了方便演示如何使用，在此模块增加了右键菜单，可以添加消息、删除消息、清空消息。</span></p><h3 id='94-云台控制'><span>9.4 云台控制</span></h3><p><img src="snap/9-4-1.jpg" referrerpolicy="no-referrer">
<span>云台控制模块，可以对选中的通道的摄像机（ONVIF协议），进行云台控制，可以控制球机的上下左右等各个方位的移动，还可以调节变倍步长，至于变焦和光圈，目前onvif协议中没看到对应的协议支持，没有实现。</span></p><h3 id='95-设备控制'><span>9.5 设备控制</span></h3><p><img src="snap/9-5-1.jpg" referrerpolicy="no-referrer">
<span>设备控制模块，可以对选中的通道的摄像机（ONVIF协议），进行获取参数、设置参数、手动校时、重启设备操作，可以对摄像机的明亮度、对比度、饱和度进行设置。</span></p><h3 id='96-预置位置'><span>9.6 预置位置</span></h3><p><span>目前空的，后期增加中。</span></p><h3 id='97-巡航设置'><span>9.7 巡航设置</span></h3><p><span>目前空的，后期增加中。</span></p><h3 id='98-悬浮地图'><span>9.8 悬浮地图</span></h3><p><span>悬浮地图子模块，使用的百度地图，支持在线和离线，用于显示对于设备的位置，支持鼠标直接拖动和缩放。</span></p><p><img src="snap/9-8-1.jpg" referrerpolicy="no-referrer">
<span>具体和飞行轨迹模块类似。</span></p><h3 id='99-飞行轨迹'><span>9.9 飞行轨迹</span></h3><p><img src="snap/9-9-1.jpg" referrerpolicy="no-referrer">
<span>专为无人机打造的模块，也可以作为机器人移动模块，通过传入一个经纬度值，实时更新设备的位置和绘制轨迹，模块已经内置了接口进行处理，支持不同设备不同的轨迹颜色（这个功能好）。</span></p><h3 id='910-飞行监控'><span>9.10 飞行监控</span></h3><p><img src="snap/9-10-1.jpg" referrerpolicy="no-referrer">
<span>目前放置的是6个飞行套装控件，默认定时器模拟数据，可以自行传入真实的数据会自动显示值。</span></p><h3 id='911-数据调试'><span>9.11 数据调试</span></h3><p><img src="snap/9-11-1.jpg" referrerpolicy="no-referrer">
<span>数据调试模块，用于显示通信串口的数据，自定义不同颜色显示，可以勾选过滤某个串口进行数据查看，也可以选择所有数据，还可以勾选暂停显示复选框用来暂停打印显示信息。</span></p><h3 id='912-运动仿真'><span>9.12 运动仿真</span></h3><p><span>此模块留给用户自行填入内容。</span></p><h3 id='913-图像增强'><span>9.13 图像增强</span></h3><p><span>此模块留给用户自行填入内容。</span></p><h3 id='914-网页浏览'><span>9.14 网页浏览</span></h3><p><img src="snap/9-14-1.jpg" referrerpolicy="no-referrer">
<span>网页浏览模块，用于传入一个网页地址，打开对应的网页进行浏览，可用于网页展示信息，支持多个，可以自行增加，代码中演示了一个。</span></p><h2 id='10-各系统运行图'><span>10 各系统运行图</span></h2><h3 id='101-windows-mingw'><span>10.1 windows-mingw</span></h3><p><img src="snap/10-1-1.jpg" referrerpolicy="no-referrer"></p><h3 id='102-windows-msvc'><span>10.2 windows-msvc</span></h3><p><img src="snap/10-2-1.jpg" referrerpolicy="no-referrer"></p><h3 id='103-linux-ubuntu'><span>10.3 linux-ubuntu</span></h3><p><img src="snap/10-3-1.jpg" referrerpolicy="no-referrer">
<img src="snap/10-3-2.jpg" referrerpolicy="no-referrer"></p><h3 id='104-linux-deepin'><span>10.4 linux-deepin</span></h3><p><img src="snap/10-4-1.jpg" referrerpolicy="no-referrer">
<img src="snap/10-4-2.jpg" referrerpolicy="no-referrer"></p><h3 id='105-linux-centeros'><span>10.5 linux-centeros</span></h3><p><img src="snap/10-5-1.jpg" referrerpolicy="no-referrer"></p><h3 id='106-linux-uos'><span>10.6 linux-uos</span></h3><p><img src="snap/10-6-1.jpg" referrerpolicy="no-referrer">
<img src="snap/10-6-2.jpg" referrerpolicy="no-referrer"></p><h3 id='107-linux-kylin'><span>10.7 linux-kylin</span></h3><p><img src="snap/10-7-1.jpg" referrerpolicy="no-referrer">
<img src="snap/10-7-2.jpg" referrerpolicy="no-referrer"></p><h3 id='108-unix-mac'><span>10.8 unix-mac</span></h3><p>&nbsp;</p><p><img src="snap/10-8-1.jpg" referrerpolicy="no-referrer">
<img src="snap/10-8-2.jpg" referrerpolicy="no-referrer">
<img src="snap/10-8-3.jpg" referrerpolicy="no-referrer"></p><h2 id='11-程序框架说明'><span>11 程序框架说明</span></h2><p><span>备注：下面的截图和说明未必是最新的，但是大部分是一致的，整体的框架不会改变，可能会有新增加子模块和代码，具体以最新的代码为准。</span></p><h3 id='111-整体代码结构'><span>11.1 整体代码结构</span></h3><p><img src="snap/11-1-1.jpg" referrerpolicy="no-referrer">
<span>本系统采用模块化的设备，有用到第三方开源类库比如串口通信qextserialport，全部放在3rd下面，有用到很多自己封装完善的通用类库比如ffmpeg视频监控，全部放在core下面，设备通信和辅助处理全部放在class下面，所有界面全部放在ui下面，相当于一个个小的组件合起来，最终形成了整个监控系统的完整代码。</span></p><h3 id='112-主模块说明'><span>11.2 主模块说明</span></h3><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>3rd</span></td><td><span>一些第三方开源的类库，比如串口通信qextserialport。</span></td></tr><tr><td><span>class</span></td><td><span>存放系统初始化、样式控制、自定义控件、设备通信等。</span></td></tr><tr><td><span>core</span></td><td><span>本人一直持续更新完善的通用的类库，比如ffmpeg视频监控。</span></td></tr><tr><td><span>ui</span></td><td><span>所有的界面都分门别类放在这里。</span></td></tr></tbody></table></figure><h3 id='113-子模块说明'><span>11.3 子模块说明</span></h3><h4 id='1131-第三方类库'><span>11.3.1 第三方类库</span></h4><p><img src="snap/11-3-1.jpg" referrerpolicy="no-referrer">
<span>这里放的全部是第三方开源的轮子，感谢开源、感谢github、gitee等开源社区。</span></p><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>3rd_qextserialport</span></td><td><span>第三方串口通信qextserialport，这个类比较稳定可靠，经过了几十个项目持续数十年运行的考验，不用Qt自带的串口类。</span></td></tr></tbody></table></figure><p><span>具体代码不做过多说明。</span></p><h4 id='1132-通信及辅助类'><span>11.3.2 通信及辅助类</span></h4><p><img src="snap/11-3-2-1.jpg" referrerpolicy="no-referrer">
<span>这里放的都是一些系统初始化、设备通信相关的类。</span></p><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>api</span></td><td><span>存放数据库表映射成对应的全局队列数据、通用的辅助函数类。</span></td></tr><tr><td><span>app</span></td><td><span>全局配置参数管理类、秘钥管理类、通用函数。</span></td></tr><tr><td><span>device</span></td><td><span>设备通信管理，比如机器人通信、无人机通信、人工智能处理等。</span></td></tr><tr><td><span>flight</span></td><td><span>飞行套件控件集合。</span></td></tr><tr><td><span>usercontrol</span></td><td><span>当前系统的自定义控件全部放在这里，其中包括云台仪表盘、通用视频监控等控件。</span></td></tr></tbody></table></figure><h5 id='11321-模块-api'><span>11.3.2.1 模块-api</span></h5><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>dbdata</span></td><td><span>将数据库表映射到全局变量数据队列，比如将摄像机表ipcinfo转成QStringList存放一行行数据，这样在程序中运算比较速度极快，直接内存比较，不用每次都去读取数据库。</span></td></tr><tr><td><span>dbquery</span></td><td><span>所有的数据库查询插入更新等操作都在这里，比如查询摄像机表、插入日志记录等。</span></td></tr><tr><td><span>savelog</span></td><td><span>日志钩子类，将系统中所有的打印信息转为日志存储或者输出到网络等，本系统目前没有用到，后期可以开启用来打印输出日志信息。</span></td></tr><tr><td><span>saveruntime</span></td><td><span>保存运行时间类，用来存储系统启动后每隔一段时间就输出一条记录用来记录启动后软件运行了多久，方便分析问题。</span></td></tr></tbody></table></figure><h5 id='11322-模块-app'><span>11.3.2.2 模块-app</span></h5><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>appconfig</span></td><td><span>配置参数类，整个系统的配置参数存放在ini文件中，跨平台，所有参数都对应一个变量，读取配置参数的时候将值赋值给变量，写入的时候将变量值写入到配置文件。</span></td></tr><tr><td><span>appdata</span></td><td><span>全局变量类，系统中无可避免需要一些全局变量方便处理，都放在此类，比如版本号、录像机类型、摄像机类型、当前用户信息、地图宽度高度、左侧右侧顶部底部宽高等。</span></td></tr><tr><td><span>appevent</span></td><td><span>全局事件转发类，系统越复杂信号需要传递的层级越多，所以需要一个全局事件转发类，用来中转这些事件，这样永远只需要两层就可以收到信号进行处理，而且整个系统看起来干净整洁，不会说一个信号传递到了N个地方乱七八糟，建议需要跨层级传递的信号都放在这里中转。比如软件退出信号，可能多个界面需要收到退出信号进行保存和其他处理，如果从关闭界面发出信号传递给需要的界面，那不知道要中间层层传递多少次，有了这个全局事件转发类，你只需要将事件传给appevent，需要接收事件的地方关联这个信号就行，appevent为全局单例类，整个系统唯一。通用的一些信号有软件退出、全局样式改变、主窗体变化（0-最小化 1-最大化 2-恢复 3-关闭 4-移动 5-尺寸变化）等。</span></td></tr><tr><td><span>appfun</span></td><td><span>通用辅助函数处理，比如系统重启、导入导出数据、校验权限等。</span></td></tr><tr><td><span>appinit</span></td><td><span>程序初始化类，在main函数中，会先执行这个初始化的类，比如初始化皮肤、字体、数据库、样式等操作，这些都是要优先在窗体加载前执行的，执行完毕以后再打开窗体主界面。</span></td></tr><tr><td><span>appkey</span></td><td><span>秘钥管理类，指定校验秘钥文件，可设置运行时间、设备数量等限制，支持根据硬件指纹特征生成机器码文件等。</span></td></tr><tr><td><span>appnav</span></td><td><span>菜单导航管理类，用来控制和显示顶部导航栏、左侧导航栏的样式。很多子界面需要用到，所以封装成一个专门管理这个的类。</span></td></tr><tr><td><span>appstyle</span></td><td><span>全局样式管理类，整个系统的样式全部放在这里，一般加载流程是先读取样式表文件，然后将本系统独特的样式（比如开关按钮、视频监控、云台仪表盘）内容追加到后面，最后统一设置全局样式，在main函数中加载，和appinit类一样放在最前面执行。</span></td></tr></tbody></table></figure><h5 id='11323-模块-device'><span>11.3.2.3 模块-device</span></h5><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>devicehelper</span></td><td><span>整个系统设备管理辅助类，比如插入窗口消息、加载设备列表、加载图片地图、加载设备按钮、初始化视频控件等。</span></td></tr><tr><td><span>devicemap</span></td><td><span>设备图片地图管理类，相当于一次性加载所有图片到内存，当要切换或者显示的时候，直接从内存取出来设置即可，速度极快，瞬间相应，纯粹是为了加快相应速度以及可能在图片上进行绘制增加的功能，比从文件系统读取图片文件显示快N倍。</span></td></tr><tr><td><span>deviceonvif</span></td><td><span>设备onvif通信管理类，比如获取当前选中通道的onvif地址、开启事件订阅、校对时间、重启设备、获取视频参数、设置视频参数、云台控制等，这里是具体的需要和摄像机信息表及视频通道关联的处理，所以不能放到通用的onvif模块中。</span></td></tr><tr><td><span>devicerobot</span></td><td><span>机器人串口通信管理类。</span></td></tr><tr><td><span>devicerobot2</span></td><td><span>机器人串口通信管理类2，有串口数据转发功能。</span></td></tr><tr><td><span>devicesmart</span></td><td><span>人工智能处理类，最常见的应用就是设置一个视频控件，然后在视频控件上绘制人脸框、文字信息等，比如设备的实时运行状态。</span></td></tr><tr><td><span>deviceuavsvideo</span></td><td><span>无人机视频监控类，将视频控件设置过来，然后就可以将自己人工智能算法处理后的图片传过来进行绘制，类似于实时视频效果。</span></td></tr></tbody></table></figure><h5 id='11324-模块-flight'><span>11.3.2.4 模块-flight</span></h5><p><span>飞控套件集合，具体代码不做过多说明，具体可购买自定义控件大全参见演示示例。</span></p><h5 id='11325-模块-usercontrol'><span>11.3.2.5 模块-usercontrol</span></h5><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>gaugecloud</span></td><td><span>云台仪表盘控件。</span></td></tr><tr><td><span>squarelayout</span></td><td><span>正方形布局控件，所有飞机控件都需要用这个布局，不然控件拉伸扁平很难看。</span></td></tr><tr><td><span>videobox</span></td><td><span>视频监控盒子控件，用于统一管理视频监控主界面，包括通道切换等。</span></td></tr><tr><td><span>videoplayback</span></td><td><span>视频回放控件。</span></td></tr><tr><td><span>videowidget</span></td><td><span>通用视频播放控件。</span></td></tr><tr><td><span>widgetsound</span></td><td><span>声音面板控件，主界面右下角单击弹出音量条。</span></td></tr></tbody></table></figure><h4 id='1133-核心通用类库'><span>11.3.3 核心通用类库</span></h4><p><img src="snap/11-3-3-1.jpg" referrerpolicy="no-referrer">
<span>这里放的全部是个人一直持续更新完善的独创的轮子，所有的项目都公用这些轮子，用到哪个就包含哪个进来，更新只需要更新轮子代码就行。</span>
<span>视频监控系统包含的轮子超级丰富给力，物超所值，涵盖了数据导出模块、数据库应用、视频监控、ONVIF通信、TCP文件传输、地图应用、通用浏览器内核等。</span></p><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>core_control</span></td><td><span>通用自定义控件，很多系统经常用到的控件全部放在这里。</span></td></tr><tr><td><span>core_dataout</span></td><td><span>数据导入导出到xls/pdf和打印类库，极速、跨平台、无依赖。</span></td></tr><tr><td><span>core_db</span></td><td><span>数据库通用类库比如数据库线程管理、数据清理、数据采集等。</span></td></tr><tr><td><span>core_ffmpeg</span></td><td><span>视频监控内核ffmpeg版本，本系统默认采用的内核。</span></td></tr><tr><td><span>core_vlc</span></td><td><span>视频监控内核vlc版本，本系统自带该内核。</span></td></tr><tr><td><span>core_mpv</span></td><td><span>视频监控内核mpv版本，需要额外购买，不在视频监控系统中。</span></td></tr><tr><td><span>core_haikang</span></td><td><span>视频监控内核海康sdk版本，需要额外购买，不在视频监控系统中。</span></td></tr><tr><td><span>core_map</span></td><td><span>地图综合应用类库，百度地图（支持在线离线）和echart封装类等。</span></td></tr><tr><td><span>core_onvif</span></td><td><span>onvif功能封装类，包括设备搜索、云台控制、设备参数设置等。</span></td></tr><tr><td><span>core_opengl</span></td><td><span>opengl封装类，支持打开yuv/nv12文件，绘制yuv/nv12帧数据，一般搭配ffmpeg视频内核视频，直接走GPU绘制。</span></td></tr><tr><td><span>core_tcpfile</span></td><td><span>文件多线程收发类，支持多个并发。</span></td></tr><tr><td><span>core_video</span></td><td><span>通用的视频监控管理类，封装了通用的视频控件和多通道统一管理。</span></td></tr><tr><td><span>core_webview</span></td><td><span>通用浏览器控件类，同时支持webkit、wenengine、miniblink三种内核，打通了所有的Qt版本。</span></td></tr></tbody></table></figure><h5 id='11331-模块-corecontrol'><span>11.3.3.1 模块-core_control</span></h5><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>bottomwidget</span></td><td><span>通用底部状态栏控件，可以设置软件名称、版本号、运行时间等。</span></td></tr><tr><td><span>colorcombobox</span></td><td><span>颜色下拉框控件，在系统设置中有。</span></td></tr><tr><td><span>cpumemorylabel</span></td><td><span>CPU和内存使用情况标签控件，主界面右上角显示。</span></td></tr><tr><td><span>customtitlebar</span></td><td><span>停靠窗体自定义标题栏控件。</span></td></tr><tr><td><span>devicebutton</span></td><td><span>设备按钮控件，比如图片地图模块中用到，可设置不同的图标样式和状态等，双击发出信号进行相应处理比如弹出对应视频预览等。</span></td></tr><tr><td><span>framelesswidget</span></td><td><span>无边框窗体管理类，无边框拖动+拉伸，主界面就用到了这个类。</span></td></tr><tr><td><span>lcddatetime</span></td><td><span>软件右上角显示时间的控件。</span></td></tr><tr><td><span>panelwidget</span></td><td><span>面板容器控件，主界面子模块表格消息，就用到此控件，用于将一堆widget放到此容器进行管理，自动形成滚动条等。</span></td></tr><tr><td><span>switchbutton</span></td><td><span>开关按钮控件，在系统设置中存在大量该控件。</span></td></tr><tr><td><span>xslider</span></td><td><span>滑动条控件，在原有滑动条基础上增加了鼠标按下立即定位等。</span></td></tr></tbody></table></figure><h5 id='11332-模块-coredataout'><span>11.3.3.2 模块-core_dataout</span></h5><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>datacreat</span></td><td><span>通用数据报表内容创建类，比如生成表格格式的html内容，然后赋值给dataprint直接打印，里面举例了图文混排的报告内容，后期会不断增加其他模板，也可以自行增加其他模板数据。</span></td></tr><tr><td><span>datacsv</span></td><td><span>导入导出数据，csv格式，可设置分隔符。拓展名。过滤条件等。</span></td></tr><tr><td><span>datahead</span></td><td><span>当前组件通用头文件。</span></td></tr><tr><td><span>datahelper</span></td><td><span>辅助类，比如校验规则函数，通用数据导出+打印函数。</span></td></tr><tr><td><span>dataprint</span></td><td><span>数据打印到pdf及纸张，支持多线程。</span></td></tr><tr><td><span>dataxls</span></td><td><span>数据导出到xls类，支持多线程导出。</span></td></tr></tbody></table></figure><h5 id='11333-模块-coredb'><span>11.3.3.3 模块-core_db</span></h5><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>dbcleanthread</span></td><td><span>自动清理数据线程类。</span></td></tr><tr><td><span>dbconnthread</span></td><td><span>数据库通信管理线程类。</span></td></tr><tr><td><span>dbdelegate</span></td><td><span>自定义委托全家桶，包括复选框、下拉框、密码框、按钮等。</span></td></tr><tr><td><span>dbhead</span></td><td><span>当前组件通用头文件。</span></td></tr><tr><td><span>dbhelper</span></td><td><span>各种数据库应用函数封装，比如初始化数据库、执行sql语句等。</span></td></tr><tr><td><span>dbhttpthread</span></td><td><span>网络请求数据采集类。</span></td></tr><tr><td><span>dbpage</span></td><td><span>数据库通用翻页类。</span></td></tr><tr><td><span>dbpagemodel</span></td><td><span>数据库翻页类数据模型。</span></td></tr><tr><td><span>navpage</span></td><td><span>分页导航控件。</span></td></tr></tbody></table></figure><h5 id='11334-模块-coreffmpeg'><span>11.3.3.4 模块-core_ffmpeg</span></h5><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>ffmpegconvert</span></td><td><span>各种转换处理函数封装。</span></td></tr><tr><td><span>ffmpeghead</span></td><td><span>当前组件通用头文件。</span></td></tr><tr><td><span>ffmpeghelper</span></td><td><span>辅助类，包括版本号，校验url地址、获取流索引等。</span></td></tr><tr><td><span>ffmpegsync</span></td><td><span>音视频同步类，包括了同步以及发出当前播放进度信号。</span></td></tr><tr><td><span>ffmpegthread</span></td><td><span>核心解码类，主要代码都在这，包括音视频的解码。</span></td></tr><tr><td><span>ffmpegtool</span></td><td><span>工具类，用于执行ffmpeg的命令获取结果。</span></td></tr><tr><td><span>ffmpegwidget</span></td><td><span>视频显示窗体类，解码后到这里显示，依赖ffmpegthread。</span></td></tr><tr><td><span>videoffmpeg</span></td><td><span>多通道管理类。</span></td></tr></tbody></table></figure><h5 id='11335-模块-coremap'><span>11.3.3.5 模块-core_map</span></h5><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>echartjs</span></td><td><span>echart模块中用到的json文件转js文件，获取js文件中的名字和经纬度等处理。</span></td></tr><tr><td><span>echarts</span></td><td><span>echart封装类，可加载仪表盘、闪烁点图、迁徙图、世界地图、区域地图等，每个点可自定义颜色和提示信息等。</span></td></tr><tr><td><span>mapbaidu</span></td><td><span>百度地图封装类，支持在线和离线两种模式。</span></td></tr></tbody></table></figure><h5 id='11336-模块-coreonvif'><span>11.3.3.6 模块-core_onvif</span></h5><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>onvifbase</span></td><td><span>基础类，用于获取设备信息、服务文件地址、能力文件地址、媒体文件地址、视频流地址等。</span></td></tr><tr><td><span>onvifdevice</span></td><td><span>设备类，核心处理及管理，包括设置用户信息请求onvif地址、获取设备信息、云台控制、事件订阅、抓拍图片等。</span></td></tr><tr><td><span>onvifevent</span></td><td><span>事件订阅具体实现类，可设置请求超时时间等。</span></td></tr><tr><td><span>onvifhead</span></td><td><span>当前组件通用头文件。</span></td></tr><tr><td><span>onvifhelper</span></td><td><span>辅助类，比如获取UUID用于请求、判断IP合法、获取本机IP地址集合、管理系统中所有onvif设备对象等。</span></td></tr><tr><td><span>onvifmedia</span></td><td><span>获取媒体文件具体解析类。</span></td></tr><tr><td><span>onvifother</span></td><td><span>其他处理类，比如系统重启、NTP校时、获取和设置网络信息、获取和设备时间、获取和设置图片参数等。</span></td></tr><tr><td><span>onvifptz</span></td><td><span>云台控制实现类，包括绝对移动、相对移动等。</span></td></tr><tr><td><span>onvifquery</span></td><td><span>数据查询类，用于将接收到的xml数据解析，并赋值字符串比如命名空间、设备地址、媒体地址、事件地址等。</span></td></tr><tr><td><span>onvifrequest</span></td><td><span>网络请求类，包括设置用户信息、获取用户token数据、获取xml头部数据等，通用的请求数据返回结果函数。</span></td></tr><tr><td><span>onvifsearch</span></td><td><span>设备搜索类，支持广播搜索、指定地址搜索，可获取设备信息集合、获取设备地址集合。</span></td></tr><tr><td><span>onvifservices</span></td><td><span>服务类，用于获取媒体地址、云台地址等。</span></td></tr><tr><td><span>onvifsnap</span></td><td><span>图片抓拍实现类，包括获取抓图地址、抓拍图片等。</span></td></tr></tbody></table></figure><h5 id='11337-模块-coreopengl'><span>11.3.3.7 模块-core_opengl</span></h5><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>openglhead</span></td><td><span>当前组件通用头文件。</span></td></tr><tr><td><span>nv12glwidget</span></td><td><span>继承自QGLWidget的NV12格式OPENGL绘制窗体。</span></td></tr><tr><td><span>nv12openglwidget</span></td><td><span>继承自QOpenGLWidget的NV12格式OPENGL绘制窗体。</span></td></tr><tr><td><span>yuvglwidget</span></td><td><span>继承自QGLWidget的YUV格式OPENGL绘制窗体。</span></td></tr><tr><td><span>yuvopenglwidget</span></td><td><span>继承自QOpenGLWidget的YUV格式OPENGL绘制窗体。</span></td></tr></tbody></table></figure><h5 id='11338-模块-corequi'><span>11.3.3.8 模块-core_qui</span></h5><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>iconfont</span></td><td><span>图形字体类，对应阿里巴巴的图形字体文件，系统中大量运用，将字体中的值转成图片显示。</span></td></tr><tr><td><span>iconhelper</span></td><td><span>图形字体类，对应国际开源的fontawesome图形字体。</span></td></tr><tr><td><span>quiconfig</span></td><td><span>存储当前组件的配置参数信息，比如全局的字体名称、字号、无边框窗体的最小化最大化关闭等图标、样式表的颜色值。</span></td></tr><tr><td><span>quidateselect</span></td><td><span>自定义日期范围选择对话框。</span></td></tr><tr><td><span>quihead</span></td><td><span>当前组件通用头文件。</span></td></tr><tr><td><span>quihelper</span></td><td><span>项目通用辅助类，各种常用函数的封装，比如获取当前屏幕分辨率、设置字体、设置编码、加载翻译文件、各种进制数据转换、弹出各种对话框、设置延时时间等。</span></td></tr><tr><td><span>quiinputbox</span></td><td><span>自定义输入框窗体，可指定不同的输入类型比如文本框、下拉框等。</span></td></tr><tr><td><span>quimessagebox</span></td><td><span>自定义信息消息框窗体，可设置关闭倒计时，不同的类型比如信息框、询问框、错误框等。</span></td></tr><tr><td><span>quistyle</span></td><td><span>当前组件通用样式设置管理类，可以指定枚举类型样式、传入样式内容设置、获取样式表文件对应的颜色值等。当前组件样式相关的处理函数都放在这里，统一管理。</span></td></tr><tr><td><span>quitipbox</span></td><td><span>自定义右下角信息对话框，可设置对齐方式、关闭倒计时等。</span></td></tr><tr><td><span>quiwidget</span></td><td><span>自定义无边框窗体，可设置标题，各种图标等。</span></td></tr></tbody></table></figure><h5 id='11339-模块-coretcpfile'><span>11.3.3.9 模块-core_tcpfile</span></h5><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>tcpfilehead</span></td><td><span>当前组件通用头文件。</span></td></tr><tr><td><span>tcpfilehelper</span></td><td><span>辅助类，包括将字节转为MB单位、初始化表格控件、生成表格行、数据加密解密、解压文件、重启系统等。</span></td></tr><tr><td><span>tcpreceivefileserver</span></td><td><span>接收文件服务类，管理多个接收文件线程，支持监听端口被动接收文件和主动连接服务器接收文件。</span></td></tr><tr><td><span>tcpreceivefilethread</span></td><td><span>接收文件线程类，根据发送的文件名、包编号、块大小、挨个接收数据最终形成文件，可设置保存文件夹等。</span></td></tr><tr><td><span>tcpsearchfileserver</span></td><td><span>搜索文件服务类，目前没用，用于接收请求搜索文件是否存在。</span></td></tr><tr><td><span>tcpsendfilethread</span></td><td><span>发送文件线程类，按照 文件开始符+文件大小+文件内容+文件结束符 逐个分包发送，可对文件的每个包进行加密传输。</span></td></tr></tbody></table></figure><h5 id='113310-模块-corevideo'><span>11.3.3.10 模块-core_video</span></h5><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>commonvideomanage</span></td><td><span>通用视频管理类，比如定时器排队打开视频、排队重连视频，可设置超时时间、打开间隔、重连间隔等。</span></td></tr><tr><td><span>commonvideowidget</span></td><td><span>通用视频控件类，视频监控系统支持多种内核，每种内核对应的视频控件接口一样，根据预定义关键字识别具体的视频控件类，搞个通用的视频控件类，就不用每个用到该控件的代码文件去挨个判断预定义变量生成对应的视频控件，很大减少重复冗余代码量。</span></td></tr></tbody></table></figure><h5 id='113311-模块-corewebview'><span>11.3.3.11 模块-core_webview</span></h5><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>webcore.pri</span></td><td><span>通用的根据不同的Qt版本、不同的编译器环境、不同的操作系统，加载对应的浏览器内核模块和定义不同的变量。</span></td></tr><tr><td><span>miniblink</span></td><td><span>miniblink封装处理类。</span></td></tr><tr><td><span>webhelper</span></td><td><span>经纬度转换、获取小数点经纬度值等常用处理函数。</span></td></tr><tr><td><span>webjsdata</span></td><td><span>通用的浏览器控件和Qt程序交互数据中转类。</span></td></tr><tr><td><span>webview</span></td><td><span>通用浏览器控件，支持webkit、webengine、miniblink。</span></td></tr></tbody></table></figure><h4 id='1134-界面ui'><span>11.3.4 界面UI</span></h4><p><img src="snap/11-3-4-1.jpg" referrerpolicy="no-referrer">
<span>这里分门别类存放的各种功能集合的界面类，每个类都一个ui文件、一个h头文件、一个cpp实现文件，方便快速查找对应功能的界面，也方便拓展增加界面。</span>
<span>不仅分文件夹存放的，而且命名也尽量按照对应功能打头，比如系统设置模块中的都用frmconfig打头，外层文件夹是整齐的，内部代码也是整齐的。</span></p><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>frmconfig</span></td><td><span>系统设置模块，包括基本设置、录像机管理、摄像机管理、轮询管理、用户管理、视频上传等。</span></td></tr><tr><td><span>frmdata</span></td><td><span>日志查询模块，包括本地日志、设备日志等。</span></td></tr><tr><td><span>frmdemo</span></td><td><span>演示demo示例，用于演示具体控件或者功能的使用，方便学习参考，比如视频图片、视频控件、视频存储都单独的使用demo。</span></td></tr><tr><td><span>frmipc</span></td><td><span>存放摄像机处理相关的模块，比如设备控制，云台控制、预置位、巡航设置等。之前放在frmmodule模块中，后面独立出来管理更方便。</span></td></tr><tr><td><span>frmmain</span></td><td><span>主界面模块，包括登录登出界面、主界面、右上角时间组件、欢迎组件等。</span></td></tr><tr><td><span>frmmap</span></td><td><span>地图模块，包括通用地图内核界面、图片地图、在线地图、离线地图、路径规划等。</span></td></tr><tr><td><span>frmmodule</span></td><td><span>停靠子窗体模块，包括停靠窗体管理核心类、设备列表、窗口信息、图文警情、设备轨迹、网页浏览等模块。将摄像机、机器人、无人机相关的模块放到了对应的模块文件夹，这里放的是系统通用的模块。</span></td></tr><tr><td><span>frmrobot</span></td><td><span>无人机模块，包括图像增强、飞行监控等模块。</span></td></tr><tr><td><span>frmuavs</span></td><td><span>无人机模块，包括图像增强、飞行监控等模块。</span></td></tr><tr><td><span>frmvideo</span></td><td><span>视频监控模块，所有视频监控相关的都放在这里，包括主界面的视频监控布局窗体、视频回放、远程回放、图片回放等。</span></td></tr></tbody></table></figure><h5 id='11341-模块-frmconfig'><span>11.3.4.1 模块-frmconfig</span></h5><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>frmconfig</span></td><td><span>系统设置模块主界面，采用堆栈窗体形式，加载多个子界面比如摄像机管理、轮询管理等。</span></td></tr><tr><td><span>frmconfigdb</span></td><td><span>数据库设置，独立出来，很多系统通用。</span></td></tr><tr><td><span>frmconfigipc</span></td><td><span>摄像机管理，可以增加、删除、修改、清空、导入、导出、打印摄像机信息。</span></td></tr><tr><td><span>frmconfigipcsearch</span></td><td><span>onvif设备搜索，独立出来的窗体，可以搜索局域网内的所有onvif摄像机信息，搜索完以后获取摄像机的视频流地址等，最后可以单个添加或者批量选中添加到摄像机信息表格中。</span></td></tr><tr><td><span>frmconfignvr</span></td><td><span>录像机管理，可以增加、删除、修改、清空、导入、导出、打印录像机信息。</span></td></tr><tr><td><span>frmconfigpoll</span></td><td><span>轮询管理，可以增加、删除、修改、清空、导入、导出、打印轮询点信息。可以按照设定规则批量生成轮询点信息。</span></td></tr><tr><td><span>frmconfigpollplus</span></td><td><span>将轮询管理中的轮询参数配置、分组管理、批量添加等独立出来的界面，方便管理和拓展。</span></td></tr><tr><td><span>frmconfigsave</span></td><td><span>录像计划，目前空的，等想好了怎么设计好在实现。</span></td></tr><tr><td><span>frmconfigsystem</span></td><td><span>系统设置，包括基本设置、视频参数、数据库设置、地图配置、功能激活、颜色配置、串口配置、网络配置等。</span></td></tr><tr><td><span>frmconfiguser</span></td><td><span>用户管理，可以增加、删除、修改、清空、导入、导出、打印用户信息。每个用户可以勾选不同的模块权限。</span></td></tr></tbody></table></figure><h5 id='11342-模块-frmdata'><span>11.3.4.2 模块-frmdata</span></h5><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>frmdata</span></td><td><span>日志查询模块主界面，采用堆栈窗体形式，加载多个子界面包括本地日志、设备日志等。</span></td></tr><tr><td><span>frmdatadevice</span></td><td><span>设备日志，通过私有协议从NVR取对应设备日志信息。</span></td></tr><tr><td><span>frmdatauser</span></td><td><span>本地地址，用户操作的日志信息，可查询和导出打印数据记录。</span></td></tr></tbody></table></figure><h5 id='11343-模块-frmdemo'><span>11.3.4.3 模块-frmdemo</span></h5><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>frmdemo</span></td><td><span>单独的功能演示示例主窗体，加载多个子界面比如视频控件等。</span></td></tr><tr><td><span>frmdemovideoimage</span></td><td><span>视频图片示例，从图片文件夹读取图片集合，定时器绘制取出图片发给视频控件绘制。</span></td></tr><tr><td><span>frmdemovideosave</span></td><td><span>视频保存示例，演示如何对视频控件进行视频保存，可动态保存。</span></td></tr><tr><td><span>frmdemovideowidget</span></td><td><span>视频控件示例，演示视频控件如何使用。</span></td></tr></tbody></table></figure><h5 id='11344-模块-frmipc'><span>11.3.4.4 模块-frmipc</span></h5><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>frmipccontrol</span></td><td><span>设备控制模块，可对选中设备进行图片参数调节、NTP校时、设备重启、抓拍图片（ONVIF抓图）等。</span></td></tr><tr><td><span>frmipcnavigate</span></td><td><span>巡航管理模块，暂未实现，后期完善。</span></td></tr><tr><td><span>frmipcreset</span></td><td><span>预置位管理模块，暂未实现，后期完善。</span></td></tr><tr><td><span>frmipcptz</span></td><td><span>云台控制模块，可对选中的摄像机进行云台控制。</span></td></tr></tbody></table></figure><h5 id='11345-模块-frmmain'><span>11.3.4.5 模块-frmmain</span></h5><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>frmlogin</span></td><td><span>用户登录界面，三次错误关闭，下拉可选用户，内置超级密码。</span></td></tr><tr><td><span>frmlogout</span></td><td><span>用户退出界面，三次错误关闭，下拉可选用户，内置超级密码。</span></td></tr><tr><td><span>frmmain</span></td><td><span>系统主界面，采用堆栈窗体，加载各个子模块。</span></td></tr><tr><td><span>frmmain1</span></td><td><span>备用模块1界面，根据参数设置决定是否启用。</span></td></tr><tr><td><span>frmtimecpu</span></td><td><span>右上角日期时间+CPU内存显示。</span></td></tr><tr><td><span>frmwelcome</span></td><td><span>右上角欢迎信息界面。</span></td></tr></tbody></table></figure><h5 id='11346-模块-frmmap'><span>11.3.4.6 模块-frmmap</span></h5><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>frmmap</span></td><td><span>地图管理主界面，采用堆栈窗体形式，加载各个子界面比如图片地图、在线地图、离线地图、路径规划等。</span></td></tr><tr><td><span>frmmapcore</span></td><td><span>通用百度地图内核界面，用来加载百度地图，可设置在线、离线模式，有很多个窗体用到类似功能特意封装到一个类，重复利用，比如悬浮地图、飞行轨迹、路径规划等模块都用到了此内核。</span></td></tr><tr><td><span>frmmapdevice</span></td><td><span>通用的设备地图界面，在线地图和离线地图界面公用这个界面，唯一区别就是设置下地图的模式是在线还是离线。</span></td></tr><tr><td><span>frmmapimage</span></td><td><span>图片地图界面，设备作为一个个按钮点显示在对应地图上，可以拖动，双击弹出预览实时视频。</span></td></tr><tr><td><span>frmmaplocal</span></td><td><span>离线地图界面，可更新经纬度值、模拟运动轨迹等。</span></td></tr><tr><td><span>frmmapweb</span></td><td><span>在线地图界面，可更新经纬度值、模拟运动轨迹等。</span></td></tr><tr><td><span>frmmaproute</span></td><td><span>路径规划界面，可查询路线得到路线的经纬度坐标集合。</span></td></tr></tbody></table></figure><h5 id='11347-模块-frmmodule'><span>11.3.4.7 模块-frmmodule</span></h5><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>frmdevicegps</span></td><td><span>设备轨迹模块，对设定的设备随机模拟轨迹，也可传入经纬度坐标值自动移动并绘制轨迹线条，不同设备可以不同颜色。</span></td></tr><tr><td><span>frmdevicetree</span></td><td><span>设备列表模块，读取设备信息加载形成树状列表，双击或者拖动到视频监控窗体直接播放视频，提供右键菜单作为演示如何使用。</span></td></tr><tr><td><span>frmmodule</span></td><td><span>主界面中心部分窗体，采用QMainWindow类，中间加载的视频监控面板，其余new出来每个子模块，子模块可停靠和悬浮拖动等。不同工作模式下的各种子模块都在此加载。同时负责管理模块的显示隐藏菜单。</span></td></tr><tr><td><span>frmmsglist</span></td><td><span>图文警情模块，也叫消息列表模块，带有右键菜单添加、删除、清空列表中的消息，双击可以弹出大图预览。</span></td></tr><tr><td><span>frmmsglistitem</span></td><td><span>图文警情模块子类，都是由一个个item组成放到panelwidget面板控件中，自动形成滚动条。</span></td></tr><tr><td><span>frmmsgtable</span></td><td><span>窗口消息模块，也叫表格消息模块，表格形式显示打印信息，不同的内容可以不同颜色区分。</span></td></tr><tr><td><span>frmwebview</span></td><td><span>网页浏览模块，传入一个url地址打开对应的网页，比如打开一个3D的网页。</span></td></tr></tbody></table></figure><h5 id='11348-模块-frmrobot'><span>11.3.4.8 模块-frmrobot</span></h5><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>frmrobotdata</span></td><td><span>仿真数据模块，启动机器人通信服务，接收数据解析显示。</span></td></tr><tr><td><span>frmrobotdebug</span></td><td><span>数据调试模块，可模拟发送轨迹数据测试解析类。</span></td></tr><tr><td><span>frmrobotdebug2</span></td><td><span>新数据调试模块，打印多个串口数据，不同颜色显示。</span></td></tr><tr><td><span>frmrobotemulate</span></td><td><span>运动仿真模块，预留给用户实现，一般放个3D效果。</span></td></tr><tr><td><span>frmrobotlog</span></td><td><span>机器人实时数据模块，预留给用户实现。</span></td></tr></tbody></table></figure><h5 id='11349-模块-frmuavs'><span>11.3.4.9 模块-frmuavs</span></h5><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>frmuavsflight</span></td><td><span>飞行套件控件面板，放了多个飞行仪表，默认自动模拟数据，可以传入对应数据显示。</span></td></tr><tr><td><span>frmuavsimage</span></td><td><span>图像增强模块，预留给用户实现。</span></td></tr><tr><td><span>frmuavspanel</span></td><td><span>飞行监控面板。</span></td></tr></tbody></table></figure><h5 id='113410-模块-frmvideo'><span>11.3.4.10 模块-frmvideo</span></h5><figure><table><thead><tr><th><span>名称</span></th><th><span>说明</span></th></tr></thead><tbody><tr><td><span>frmvideo</span></td><td><span>视频回放模块主界面，堆栈窗体形式，加载多个子界面比如本地回放、远程回放、设备播放等。</span></td></tr><tr><td><span>frmvideopanel</span></td><td><span>视频监控面板，主界面中间部分，这是核心，管理多个通道，通道可移除删除，拖曳打开，拖曳交换等。</span></td></tr><tr><td><span>frmvideopaneltool</span></td><td><span>视频监控底部工具栏，独立出来一个类专门管理。</span></td></tr><tr><td><span>frmvideoplayimage</span></td><td><span>图片回放模块，按照规则查询图片目录，然后可设定播放速度进行图片序列播放。</span></td></tr><tr><td><span>frmvideoplaylocal</span></td><td><span>本地回放模块，查询对应通道的本地存储的视频文件，双击播放，可暂停和拖动进度条位置。</span></td></tr><tr><td><span>frmvideoplaynvr</span></td><td><span>远程回放模块，需要用厂家sdk去实现，从NVR回放录像。</span></td></tr><tr><td><span>frmvideoplayweb</span></td><td><span>设备播放模块，通过RTSP视频流的形式从远程设备取视频进行播放，支持摄像机和录像机，手动填入地址也行。</span></td></tr><tr><td><span>frmvideopreview</span></td><td><span>视频预览窗体，比如图片或者地图上双击设备弹出的视频预览，可以多个，关闭的时候自动释放资源。</span></td></tr><tr><td><span>frmvideoupload</span></td><td><span>视频上传，将本地存储的视频文件上传到服务器。</span></td></tr></tbody></table></figure><h2 id='12-二次开发说明'><span>12 二次开发说明</span></h2><h3 id='121-开发环境搭建'><span>12.1 开发环境搭建</span></h3><h4 id='1211-常规通用步骤'><span>12.1.1 常规通用步骤</span></h4><ol start='' ><li><span>第一步：安装系统，推荐用vmware虚拟机。</span></li><li><span>第二步：安装qt环境，可以直接用官方下载的run安装包安装，有些要求用命令行安装。</span></li><li><span>第三步：写个空白窗体程序测试下是否环境正常。</span></li><li><span>第四步：编译ffmpeg，生成对应的动态库或者静态库。</span></li><li><span>第五步：打开video_system.pro项目进行编译。</span></li><li><span>第六步：打包发布，为了发布方便，推荐用静态编译的Qt+静态编译的ffmpeg，这样打包发布很清爽，就一个可执行文件。</span></li></ol><h4 id='1212-windowsmingw'><span>12.1.2 windows+mingw</span></h4><h4 id='1213-windowsmsvc'><span>12.1.3 windows+msvc</span></h4><h4 id='1214-linuxubuntu'><span>12.1.4 linux+ubuntu</span></h4><h4 id='1215-linuxdeepin'><span>12.1.5 linux+deepin</span></h4><h4 id='1216-linuxcenteros'><span>12.1.6 linux+centeros</span></h4><h4 id='1217-linuxuos'><span>12.1.7 linux+uos</span></h4><h4 id='1218-linux银河麒麟'><span>12.1.8 linux+银河麒麟</span></h4><h3 id='122-通用模块使用'><span>12.2 通用模块使用</span></h3><h3 id='123-人工智能集成'><span>12.3 人工智能集成</span></h3><h2 id='13-其他说明'><span>13 其他说明</span></h2><h3 id='131-海康onvif设置'><span>13.1 海康onvif设置</span></h3><p><span>新版的海康的摄像机，默认onvif是关闭的，需要手动开启，开启以后记得添加onvif用户，并重启摄像机应用。提示：海康旗下的萤石目前暂时不支持onvif协议。</span></p><p><img src="snap/13-1-1.jpg" referrerpolicy="no-referrer"></p><h3 id='132-大华onvif设置'><span>13.2 大华onvif设置</span></h3><p><span>大华摄像机，需要在用户管理中添加onvif用户，添加好以后建议重启摄像机应用。</span></p><p><img src="snap/13-2-1.jpg" referrerpolicy="no-referrer"></p><h3 id='133-国际onvif工具'><span>13.3 国际onvif工具</span></h3><p><span>工具的名字叫ONVIF Device Manager，可以自行搜索下载，此工具位国际官方工具，如果此工具搜索不到摄像机，则说明该摄像机不是真正的onvif摄像机，不是标准的摄像机，目前市面上的绝大部分网络摄像机都支持onvif。</span></p><p><img src="snap/13-3-1.jpg" referrerpolicy="no-referrer"></p><h3 id='134-报警输入设置'><span>13.4 报警输入设置</span></h3><p><span>默认摄像机IO输入或者开关量输入是关闭的，需要手动开启，一般都是登录到摄像机的web页面找到开关量的地方，可能描述不一样但是大致的意思差不多，一般摄像机会有两组开关量输入，而且开关量报警有常开常闭两种，都需要自己手动选择，如果是常开的话意味着闭合是属于报警，反之亦然。找两个导线接在对应口子（详见摄像机厂家的说明书，摄像机背面板也会有对应字样标识一般叫 in），短接或者扒开，都会有反应，onvif工具都能接收到信息（前提是单击过订阅事件按钮，而且顺利返回了订阅地址才行），会收到LogicalState关键字的信息，true或者1表示报警，false或者0表示正常，可能每个厂家会有所区别，需要自己拿到数据后做特殊处理，但是大部分厂家都是相似的，实在不行无非搞个contains方法判断好了。</span></p><p>&nbsp;</p><p><img src="snap/13-4-1.jpg" referrerpolicy="no-referrer">
<img src="snap/13-4-1.jpg" referrerpolicy="no-referrer">
<img src="snap/13-4-1.jpg" referrerpolicy="no-referrer"></p><h3 id='135-环境使用qtvs'><span>13.5 环境使用qt+vs</span></h3><p><span>打开项目：QT VS TOOLS – Open Qt Project File 选择 video_system.pro,然后等待项目加载完毕。</span></p><p><img src="snap/13-5-1.jpg" referrerpolicy="no-referrer">
<span>由于项目中用到了ffmpeg和vlc，引用了对应的lib库，所以在用vs+qt的开发环境中，很可能报错提示 映像是不安全的 编译通不过，需要做个设置。</span></p><p><strong><span>解决方法</span></strong></p><ol start='' ><li><span>第一步：打开该项目的“属性页”对话框。</span></li><li><span>第二步：单击“链接器”文件夹。</span></li><li><span>第三步：单击“命令行”属性页。</span></li><li><span>第四步：将 /SAFESEH:NO 键入“附加选项”框中，然后点击应用。</span></li><li><span>如果设置完发现还是不行，那应该是没有一开始就设置这个步骤，你需要打开项目以后就设置好这个步骤，再去编译，建议重新解压项目来一遍。</span></li></ol><p><img src="snap/13-5-1.jpg" referrerpolicy="no-referrer"></p><h3 id='136-数据库设置mysql'><span>13.6 数据库设置mysql</span></h3><p><img src="snap/13-6-1.jpg" referrerpolicy="no-referrer">
<span>如果在数据库设置中选择了mysql数据库，需要对mysql数据库做个设置，就是将编码设置成utf8，已设置可以跳过，不然很可能数据库无法正常使用。</span></p></div></div>

<script>(function(){var e=document.body.parentElement,t=[],n=null,i=document.body.classList.contains("typora-export-collapse-outline"),r=function(e,t,n){document.addEventListener(e,function(e){if(!e.defaultPrevented)for(var i=e.target;i&&i!=this;i=i.parentNode)if(i.matches(t)){!1===n.call(i,e)&&(e.preventDefault(),e.stopPropagation());break}},!1)};function o(){return e.scrollTop}r("click",".outline-expander",function(e){var t=this.closest(".outline-item-wrapper").classList;return t.contains("outline-item-open")?t.remove("outline-item-open"):t.add("outline-item-open"),d(),!1}),r("click",".outline-item",function(e){var t=this.querySelector(".outline-label");if(location.hash="#"+t.getAttribute("href"),i){var n=this.closest(".outline-item-wrapper").classList;n.contains("outline-item-open")||n.add("outline-item-open"),c(),n.add("outline-item-active")}});var a,s,l=function(){var e=o();n=null;for(var i=0;i<t.length&&t[i][1]-e<60;i++)n=t[i]},c=function(){document.querySelectorAll(".outline-item-active").forEach(e=>e.classList.remove("outline-item-active")),document.querySelectorAll(".outline-item-single.outline-item-open").forEach(e=>e.classList.remove("outline-item-open"))},d=function(){if(n){c();var e=document.querySelector('.outline-label[href="#'+(CSS.escape?CSS.escape(n[0]):n[0])+'"]');if(e)if(i){var t=e.closest(".outline-item-open>ul>.outline-item-wrapper");if(t)t.classList.add("outline-item-active");else{for(var r=(e=e.closest(".outline-item-wrapper")).parentElement.closest(".outline-item-wrapper");r;)r=(e=r).parentElement.closest(".outline-item-wrapper");e.classList.add("outline-item-active")}}else e.closest(".outline-item-wrapper").classList.add("outline-item-active")}};window.addEventListener("scroll",function(e){a&&clearTimeout(a),a=setTimeout(function(){l(),d()},300)});var u=function(){s=setTimeout(function(){!function(){t=[];var e=o();document.querySelector("#write").querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(n=>{var i=n.getAttribute("id");t.push([i,e+n.getBoundingClientRect().y])})}(),l(),d()},300)};window.addEventListener("resize",function(e){s&&clearTimeout(s),u()}),u()})();</script></body>
</html>